Hi, Since the dawn of OpenJDK, AbstractMap.keySet and .value were defined as package-private volatile fields. Their only use is to cache keySet and valueSet implementations from java.util collections.
However, all relevant java.util collections are not having any declared fields (an opaque reference to enclosing class is stored in final field), and they delegate straight to the backing collection. Therefore, any race on cache field is benign, and we can drop "volatile" from the fields: https://bugs.openjdk.java.net/browse/JDK-8145539 http://cr.openjdk.java.net/~shade/8145539/webrev.02/ This improves performance for keySet()/values() on AbstractMap implementations, because we don't emit barriers (volatile write in x86 case). This does not affect AbstractMap subclasses allocation performance, because the volatile field values were default since JDK-8035284. See: http://cr.openjdk.java.net/~shade/8145539/HashMapBench.java Testing: microbenchmarks, java/util jtreg on Linux x86_64 Thanks, -Aleksey