java - 在线程安全对象上同步是否会阻止可能操纵它的其他调用?

标签 java concurrency

假设我创建了一个线程安全的对象:

PriorityBlockingQueue<Object> safeQueue = new PriorityBlockingQueue<Object>();

如果我在上面同步:

synchronized (safeQueue) {
   ....
}

是否有阻塞的代码:

// some non-synchronized block
Object value = safeQueue.poll();

最佳答案

没有。唯一发生任何 阻塞的情况是另一个线程也在 对同一个对象执行同步。如果您的代码是 synchronized (safeQueue) 那么对 PriorityBlockingQueue.poll() 的调用只会在 poll() 时阻塞synchronized 方法或者如果代码使用了 synchronized (this) 代码。

当您调用 safeQueue.poll() 时,PriorityBlockingQueue 代码实际上使用的是内部 ReentrantLock不是 执行 同步 (this)。以下是 poll() 的代码:

public E poll() {
    final ReentrantLock lock = this.lock;
    lock.lock();
    try {
        return q.poll();
    } finally {
        lock.unlock();
    }
}

最后,正如您提到的,PriorityBlockingQueue 已经是可重入的,因此您无需对其进行同步以允许多个线程访问队列。当然,如果您需要在自己的代码中解决竞争条件,您可能仍然需要对其进行同步。

关于java - 在线程安全对象上同步是否会阻止可能操纵它的其他调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10559435/

相关文章:

unit-testing - 对并发的Erlang代码进行单元测试的最佳方法是什么?

java - CgLib 增强器私有(private)构造函数

java - 如何从 Linux 删除远程 Windows 中的文件夹

java - 如何使用 servlet 3.0 java 配置指定 mime 映射?

java - GWT 客户端代码中的 Collections.sort 是否会导致 JavaScript 膨胀?

concurrency - AWS Athena 并发限制 : Number of submitted queries VS number of running queries

java - Android 垃圾收集器 - 静态(类级别)var 何时重置?

java - 如何正确使用concurrentskiplistmap?

java - JNI 与 JNA 性能对比

java - 我应该使用 ConcurrentHashMap 还是 Hashmap 还是 SynchronizedMap?