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

Reply via email to