我是否需要使用;同步的;如果使用java.util.concurrent数据结构,要获取/添加的关键字?
我的代码有一个在多个线程之间共享的数据结构,但我使用的是我是否需要使用;同步的;如果使用java.util.concurrent数据结构,要获取/添加的关键字?,java,multithreading,concurrency,synchronization,thread-safety,Java,Multithreading,Concurrency,Synchronization,Thread Safety,我的代码有一个在多个线程之间共享的数据结构,但我使用的是LinkedBlockingQueue,因此在下面的代码中是否需要同步化 public synchronized String getDirectory(){ return directoryArray.poll(); } 不,它只会减慢您的应用程序,而没有任何好处。LinkedBlockingQueue#poll()的实现已经使用可重入锁实现了同步机制: public E poll() { final AtomicInt
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,
包含所有、保留和移除所有
不一定要执行
除非另有规定,否则按原子顺序
在实现中。的确如此
可能,例如,对于addAll(c)
失败后失败(抛出异常)
仅在中添加部分元素
c
由于LinkedBlockingQueue
实现了BlockingQueue
,这适用于它:
BlockingQueue
实现是线程安全的。所有排队方法都使用内部锁或其他形式的并发控制以原子方式实现其效果
这意味着不需要额外的同步。可能的重复实现可能会更改-您应该参考javadoc中定义的类的契约。同意它可以更改,但有时人们,特别是如果英语不是他们的母语,相信源代码多于javadoc。