假设我创建了一个线程安全的对象:
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/