On Wed, 6 Sep 2023 16:51:51 GMT, 温绍锦 <d...@openjdk.org> wrote: >> I'd be more comfortable replacing the use of Unsafe with either the >> ByteArray functions or VarHandles. >> Using VarHandles will enable future optimizations, whereas Unsafe is a >> primitive tool and is brittle. > >> I'd be more comfortable replacing the use of Unsafe with either the >> ByteArray functions or VarHandles. Using VarHandles will enable future >> optimizations, whereas Unsafe is a primitive tool and is brittle. > > I also agree that using VarHandler is better, but using VarHandler in > StringLatin1 causes exception, as follows: > > > final class StringLatin1 { > private static final VarHandle SHORT = > MethodHandles.byteArrayViewVarHandle(short[].class, ByteOrder.LITTLE_ENDIAN); > } > > > > make images > Building target 'images' in configuration 'macosx-aarch64-server-release' > Compiling up to 3452 files for java.base > Updating support/src.zip > Updating images/sec-bin.zip > Optimizing the exploded image > Error occurred during initialization of VM > java.lang.ExceptionInInitializerError > at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2246) > at > java.lang.invoke.VarHandles.byteArrayViewHandle(java.base/VarHandles.java:258) > at > java.lang.invoke.MethodHandles.byteArrayViewVarHandle(java.base/MethodHandles.java:4553) > at java.lang.StringLatin1.<clinit>(java.base/StringLatin1.java:84) > at java.lang.String.equals(java.base/String.java:1863) > at > java.util.ImmutableCollections$Set12.<init>(java.base/ImmutableCollections.java:797) > at java.util.Set.of(java.base/Set.java:487) > at > jdk.internal.reflect.Reflection.<clinit>(java.base/Reflection.java:58) > at > java.security.AccessController.doPrivileged(java.base/AccessController.java:319) > at > java.lang.reflect.AccessibleObject.<clinit>(java.base/AccessibleObject.java:524) > Caused by: java.lang.NullPointerException > at > java.lang.invoke.MethodHandleStatics.<clinit>(java.base/MethodHandleStatics.java:70) > at java.lang.invoke.VarHandle.<clinit>(java.base/VarHandle.java:2246) > at > java.lang.invoke.VarHandles.byteArrayViewHandle(java.base/VarHandles.java:258) > at > java.lang.invoke.MethodHandles.byteArrayViewVarHandle(java.base/MethodHandles.java:4553) > at java.lang.StringLatin1.<clinit>(java.base/StringLatin1.java:84) > at java.lang.String.equals(java.base/String.java:1863) > at > java.util.ImmutableCollections$Set12.<init>(java.base/ImmutableCollections.java:797) > at java.util.Set.of(java.base/Set.java:487) > at > jdk.internal.reflect.Reflection.<clinit>(java.base/Reflection.java:58) > at > java.security.AccessController.doPrivileged(java.base/AccessController.java:319) > at > java.lang.reflect.AccessibleObject.<clinit>(java.base/AccessibleObject.java:524)
@wenshao You can use a holder class that will get initialized only when `StringLatin1::getChars` is called. ------------- PR Comment: https://git.openjdk.org/jdk/pull/14699#issuecomment-1708765640