PriorityBlockingQueue 中的锁定/解锁推理可能是什么?

What could be the locking / unlocking reasoning in PriorityBlockingQueue?

我一直在阅读 Java 中的 source code of PriorityBlockingQueue,我想知道 :

  1. 为什么 tryGrow() 方法释放在 offer() 方法期间获取的锁,只是为了做它的非-阻塞,然后在准备替换队列内容时再次阻塞?我的意思是,它本可以保留它的锁...
  2. 这怎么行?增加涉及数组副本的队列不会导致并发添加的不当行为,当当前添加增加队列大小时,额外的添加完全可以来?

因为内存分配相对较慢,可以在数组解锁时完成。

通过释放锁,它允许其他线程在分配(可能很大的)新数组时继续运行。

因为这个过程可以在没有锁的情况下完成,所以这样做是一种很好的做法。您应该只持有锁的最短时间。

已进行充分检查以确保没有其他线程同时执行此操作。

UNSAFE.compareAndSwapInt(this, allocationSpinLockOffset, 0, 1)

一次只允许一个线程进入这段代码。

注意

lock.lock();
if (newArray != null && queue == array) {

这会再次获取锁,然后确认它要替换的数组与它在开始时获取的副本相同。如果它同时被替换,那么它只是放弃它刚刚创建的那个,假设其他线程已经增长了数组。

如果仍然相同,则将旧数据复制到新的更大的数组中,然后将其重新种植到田地中。

正如 Kamil 很好地解释的那样。

Purpose of that unlock is only to be sure that the faster thread will grow the queue, so we will not waste time while locking the "better ones".