Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
我是否需要使用;同步的;如果使用java.util.concurrent数据结构,要获取/添加的关键字?_Java_Multithreading_Concurrency_Synchronization_Thread Safety - Fatal编程技术网

我是否需要使用;同步的;如果使用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。