# HG changeset patch # User martin # Date 1522946239 25200 # Thu Apr 05 09:37:19 2018 -0700 # Node ID e8ada9b2dd892a5dc87c3de0ebdd198d28abe085 # Parent 8f2ceebdc673aff8eddd1147cb59eb0ca7040d2d 8200131: Improve lazy init of InetAddress.canonicalHostName and NativeObject.pageSize Reviewed-by: alanb diff --git a/src/java.base/share/classes/java/net/InetAddress.java b/src/java.base/share/classes/java/net/InetAddress.java --- a/src/java.base/share/classes/java/net/InetAddress.java +++ b/src/java.base/share/classes/java/net/InetAddress.java @@ -290,7 +290,10 @@ /* Used to store the name service provider */ private static transient NameService nameService = null; - /* Used to store the best available hostname */ + /** + * Used to store the best available hostname. + * Lazily initialized via a data race; safe because Strings are immutable. + */ private transient String canonicalHostName = null; /** use serialVersionUID from JDK 1.0.2 for interoperability */ @@ -622,11 +625,11 @@ * @since 1.4 */ public String getCanonicalHostName() { - if (canonicalHostName == null) { - canonicalHostName = + String value = canonicalHostName; + if (value == null) + canonicalHostName = value = InetAddress.getHostFromNameService(this, true); - } - return canonicalHostName; + return value; } /** diff --git a/src/java.base/share/classes/sun/nio/ch/NativeObject.java b/src/java.base/share/classes/sun/nio/ch/NativeObject.java --- a/src/java.base/share/classes/sun/nio/ch/NativeObject.java +++ b/src/java.base/share/classes/sun/nio/ch/NativeObject.java @@ -388,7 +388,10 @@ return byteOrder; } - // Cache for page size + /** + * Cache for page size. + * Lazily initialized via a data race; safe because ints are atomic. + */ private static int pageSize = -1; /** @@ -397,9 +400,10 @@ * @return The page size, in bytes */ static int pageSize() { - if (pageSize == -1) - pageSize = unsafe.pageSize(); - return pageSize; + int value = pageSize; + if (value == -1) + pageSize = value = unsafe.pageSize(); + return value; } }