Unsafe.{get,put}-X-Unaligned; Efficient array comparison intrinsics
Andrew Haley
aph at redhat.com
Mon Mar 9 14:11:26 UTC 2015
On 03/09/2015 11:32 AM, Peter Levart wrote:
> On 03/09/2015 10:11 AM, Andrew Haley wrote:
>> On 08/03/15 23:21, Remi Forax wrote:
>>> BE doesn't need to be an instance, method of Unsafe are instance methods
>>> just to enforce security,
>>> you can not call them if you don"t have an instance of Unsafe (and
>>> getUnsafe() does the security check).
>>>
>>> BE is private so it doesn't have to be an instance field it can be
>>> static field.
>>>
>>> And I agree with you that the native isBigEndian() should be called once
>>> in the lifetime of the VM.
>>>
>>> so the idea is to write:
>>>
>>> public boolean isBigEndian() {
>>> return BE;
>>> }
>>> private static final boolean BE = isBigEndian0();
>>>
>>> private static native boolean isBigEndian0();
>> I understand. However, the callers of isBigEndian() do their own
>> caching, so it seems to me that this will be a case of double-caching.
>> It's not important from a performance point of view, but it is
>> additional complexity.
>
> If we take a look at status quo, then the pattern for safe constant
> state in Unsafe is as follows:
>
> public native int arrayBaseOffset(Class<?> arrayClass);
>
> /** The value of {@code arrayBaseOffset(boolean[].class)} */
> public static final int ARRAY_BOOLEAN_BASE_OFFSET
> = theUnsafe.arrayBaseOffset(boolean[].class);
>
>
> ...this has the benefit that it doesn't require caching at use site. But
> the above pattern could be tweaked a bit in case of isBigEndian(). The
> method could be declared as private since it does not add a utility like
> above method which is a function of 1 argument.
>
> The argument that we don't want to expose public API is unfounded as
> Unsafe won't be visible to normal code in JDK9, right?
I see your point, but I don't want to tie our hands with respect to
future implementations. We might want to refactor this code in the
future, and leaving isBigEndian() as an accessor costs little. For
that reason I really don't want to make this a public final field but
I will cache it in Unsafe if people want me to.
Andrew.
More information about the core-libs-dev
mailing list