PriorityBlockingQueue 中的锁定/解锁推理可能是什么?
What could be the locking / unlocking reasoning in PriorityBlockingQueue?
我一直在阅读 Java 中的 source code of PriorityBlockingQueue,我想知道 :
- 为什么 tryGrow() 方法释放在 offer() 方法期间获取的锁,只是为了做它的非-阻塞,然后在准备替换队列内容时再次阻塞?我的意思是,它本可以保留它的锁...
- 这怎么行?增加涉及数组副本的队列不会导致并发添加的不当行为,当当前添加增加队列大小时,额外的添加完全可以来?
因为内存分配相对较慢,可以在数组解锁时完成。
通过释放锁,它允许其他线程在分配(可能很大的)新数组时继续运行。
因为这个过程可以在没有锁的情况下完成,所以这样做是一种很好的做法。您应该只持有锁的最短时间。
已进行充分检查以确保没有其他线程同时执行此操作。
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".
我一直在阅读 Java 中的 source code of PriorityBlockingQueue,我想知道 :
- 为什么 tryGrow() 方法释放在 offer() 方法期间获取的锁,只是为了做它的非-阻塞,然后在准备替换队列内容时再次阻塞?我的意思是,它本可以保留它的锁...
- 这怎么行?增加涉及数组副本的队列不会导致并发添加的不当行为,当当前添加增加队列大小时,额外的添加完全可以来?
因为内存分配相对较慢,可以在数组解锁时完成。
通过释放锁,它允许其他线程在分配(可能很大的)新数组时继续运行。
因为这个过程可以在没有锁的情况下完成,所以这样做是一种很好的做法。您应该只持有锁的最短时间。
已进行充分检查以确保没有其他线程同时执行此操作。
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".