В коде есть комментарий, объясняющий стратегию паразитной блокировки TreeBin, такой как:
/*
* TreeBins also require an additional locking mechanism. While
* list traversal is always possible by readers even during
* updates, tree traversal is not, mainly because of tree-rotations
* that may change the root node and/or its linkages. TreeBins
* include a simple read-write lock mechanism parasitic on the
* main bin-synchronization strategy: Structural adjustments
* associated with an insertion or removal are already bin-locked
* (and so cannot conflict with other writers) but must wait for
* ongoing readers to finish. Since there can be only one such
* waiter, we use a simple scheme using a single "waiter" field to
* block writers. However, readers need never block. If the root
* lock is held, they proceed along the slow traversal path (via
* next-pointers) until the lock becomes available or the list is
* exhausted, whichever comes first. These cases are not fast, but
* maximize aggregate expected throughput.
*/
«Почему» объясняется следующим комментарием:
/**
* TreeNodes used at the heads of bins. TreeBins do not hold user
* keys or values, but instead point to list of TreeNodes and
* their root. They also maintain a parasitic read-write lock
* forcing writers (who hold bin lock) to wait for readers (who do
* not) to complete before tree restructuring operations.
*/
ВКороче говоря, общая стратегия блокировки заключается в том, чтобы избежать блокировки путей чтения.Таким образом, карта разделена на «корзины», и каждая корзина имеет много блокировок чтения / записи.
За исключением того, что читатели фактически не блокируются, если есть конфликт блокировки.Вместо этого они пересекают всю корзину ... проверяя, была ли снята блокировка.«Паразитная» блокировка является реализацией этого.