Background on this can be found here: https://bugs.openjdk.java.net/browse/JDK-4335520
Jason ________________________________________ From: core-libs-dev <core-libs-dev-boun...@openjdk.java.net> on behalf of dmytro sheyko <dmytro.sheyko....@gmail.com> Sent: Wednesday, April 29, 2020 2:58 AM To: core-libs-dev Subject: Collections.synchronizedXXX() and internal mutex (aka SyncRoot) Hello, Have you ever discussed to make field mutex in synchronized collections accessible? Javadoc for Collections#synchronizedSortedSet suggest to iterate collection this way: SortedSet s = Collections.synchronizedSortedSet(new TreeSet()); SortedSet s2 = s.headSet(foo); ... synchronized (s) { // Note: s, not s2!!! Iterator i = s2.iterator(); // Must be in the synchronized block while (i.hasNext()) foo(i.next()); } I.e. in order to iterate subset, we also need a reference to the whole set, which is not really convenient. How about to make it possible to write: SortedSet s2 = s.headSet(foo); ... synchronized (Collections.getSyncRoot(s2)) { // Note: Collections.getSyncRoot(s2) Iterator i = s2.iterator(); // Must be in the synchronized block while (i.hasNext()) foo(i.next()); } Also I think it would be convenient to let to provide custom sync root when synchronized collection is created. E.g. Object customSyncRoot = new Object(); SortedSet s = Collections.synchronizedSortedSet(new TreeSet(), customSyncRoot); What do you think about this? Regards, Dmytro