The HashSet that was used to store the listeners has been replaced with a ConcurrentLinkedQueue.
Apparently, there are some performance issues with ConcurrentLinkedQueue.remove(...):
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6493942
I verified this bug and it seems to surface frequently with the bug's test program. However, when the number of elements in the queue is reduced to 1000, which looks like a reasonable upper limit, everything's OK.
Some performance measurements performed by Andrew Newman indicate that the use of a ConcurrentLinkedQueue has a considerable negative effect on update performance. Doing 10,000 updates on a dataset of 1M elements takes 149 seconds, while the same test takes 19 seconds with his fix.
BTree now uses synchronized LinkedList for node listeners instead of ConcurrentLinkedQueue. The latter has considerable overhead which is visible when performing ranged searches (up to a factor 2 in simple benchmark).