我的代码有一个在许多线程之间共享的数据结构,但我正在使用LinkedBlockingQueue
,所以在下面的代码中是否需要同步?
public synchronized String getDirectory(){
return directoryArray.poll();
}
我的代码有一个在许多线程之间共享的数据结构,但我正在使用LinkedBlockingQueue
,所以在下面的代码中是否需要同步?
public synchronized String getDirectory(){
return directoryArray.poll();
}
不,它只会减慢您的应用程序而没有任何好处。LinkedBlockingQueue#poll()
已经使用可重入锁实现了同步机制:
public E poll() {
final AtomicInteger count = this.count;
if (count.get() == 0)
return null;
E x = null;
int c = -1;
final ReentrantLock takeLock = this.takeLock;
takeLock.lock();
try {
if (count.get() > 0) {
x = dequeue();
c = count.getAndDecrement();
if (c > 1)
notEmpty.signal();
}
} finally {
takeLock.unlock();
}
if (c == capacity)
signalNotFull();
return x;
}
我认为您不需要额外的同步。根据文档 -链接
BlockingQueue 实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。但是,批量收集操作 addAll、containAll、retainAll 和 removeAll 不一定以原子方式执行,除非在实现中另外指定。因此,例如,addAll(c) 在仅添加 c 中的一些元素后可能会失败(抛出异常)。
自LinkedBlockingQueue
implements以来BlockingQueue
,此记录的行为适用于它:
BlockingQueue
实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果。
这意味着不需要额外的同步。