On Thu, 20 Jul 2023 10:26:03 GMT, Doug Lea <d...@openjdk.org> wrote: >> This update addresses performance issues across both LinkedTransferQueue and >> SynchronousQueue by creating a common basis for implementation across them >> (mainly in LinkedTransferQueue). Pasting from internal doc summary of >> changes: >> * * Class DualNode replaces Qnode, with fields and methods >> * that apply to any match-based dual data structure, and now >> * usable in other j.u.c classes. in particular, SynchronousQueue. >> * * Blocking control (in class DualNode) accommodates >> * VirtualThreads and (perhaps virtualized) uniprocessors. >> * * All fields of this class (LinkedTransferQueue) are >> * default-initializable (to null), allowing further extension >> * (in particular, SynchronousQueue.Transferer) >> * * Head and tail fields are lazily initialized rather than set >> * to a dummy node, while also reducing retries under heavy >> * contention and misorderings, and relaxing some accesses, >> * requiring accommodation in many places (as well as >> * adjustments in WhiteBox tests). > > Doug Lea has updated the pull request incrementally with one additional > commit since the last revision: > > nitpicks
src/java.base/share/classes/java/util/concurrent/LinkedTransferQueue.java line 397: > 395: * True if system is a uniprocessor, occasionally rechecked. > 396: */ > 397: private static boolean isUniprocessor = @DougLea If this is intentionally non-volatile, I think it is worth documenting the rationale. ------------- PR Review Comment: https://git.openjdk.org/jdk/pull/14317#discussion_r1270466743