Я читал source code of PriorityBlockingQueue в Java, и мне было интересно:Что может быть причиной блокировки/разблокировки в PriorityBlockingQueue?
- почему это tryGrow() метода рилизинга замка приобрел во время предложений() метода, просто делать свое дело не- блокировка, а затем снова заблокировать, когда готовы заменить содержимое очереди? я имею в виду, он мог бы просто сохранить замок, который у него был ...
- Как это работает? растущая очередь, которая включает в себя копию массива, не вызывает неправильного поведения при одновременных добавлениях, где дополнительные добавления могут полностью возникать, когда текущее добавление увеличивает размер очереди?
Я хотел бы добавить, что, на мой взгляд, после прочтения кода это позволит разрешить другим потокам расы растущего массива. Они в основном не могут ничего сделать. Если кто-то идет к tryGrow, мы можем быть уверены, что другой, который пытается поместить элемент, после того, как блокировка будет выпущена, может пойти только на tryGrow. Цель этой разблокировки - только убедиться, что более быстрый поток будет увеличивать очередь, поэтому мы не будем тратить время на блокировку «лучших». Надеюсь, это имеет смысл для вас :) –
@ Kamil, действительно, это имеет большой смысл. Тем не менее, я беспокоюсь, когда один поток выпущен и находится в процессе роста, в то время как следующий пытался расти, пропускает (потому что начальный уже растет), и идет и заменяет очередь – Belun
Видите ли, он не делает что благодаря if (newArray! = null && queue == array), newArray будет null, потому что другой выделяет. Он будет в мертвой петле блокировки и разблокировки блокировки, пока другой не попытается ее вырастить.И после этого они поместят свои значения, и поток, который стал массивом, будет первым благодаря блокировке перед заменой очереди. В основном, быстрее будет идти сначала, если в tryGrow, а остальное придется ждать –