On Thu, 5 Nov 2020 09:05:55 GMT, Aleksey Shipilev <sh...@openjdk.org> wrote:

>> …AccessorImpl object
>> 
>> We met real problem when using protobuf with option optimized for code size, 
>> detail in JBS https://bugs.openjdk.java.net/browse/JDK-8255883
>> 
>> Optimize solution is adding a new boolean field to detect concurrent method 
>> accessor generation in same NativeMethodAccessorImpl object, only one thread 
>> is allowed to generate accessor, other threads still invoke in jni way until 
>> parent's delegator is updated from NativeMethodAccessorImpl  to generated 
>> accessor.
>> 
>> In common case, extra overhead is an atomic operation, compared with method 
>> accessor generate, this cost is trivial.
>
> src/java.base/share/classes/jdk/internal/reflect/NativeMethodAccessorImpl.java
>  line 66:
> 
>> 64:                 && !method.getDeclaringClass().isHidden()
>> 65:                 && 
>> !ReflectUtil.isVMAnonymousClass(method.getDeclaringClass())
>> 66:                 && ACCESSOR_GENERATED.compareAndSet(this, false, true)) {
> 
> As the micro-optimization, checking that `accessor_generated` is `false` 
> before attempting a (potentially contended) CAS might fit better. (See 
> https://en.wikipedia.org/wiki/Test_and_test-and-set).

Agree this could benefit performance. Grep jdk codes (grep -R  compareAndSet 
*), not found codes with test and test-and-set pattern.

compareAndSet is intrinsic and maybe it's better let runtime/compiler generate 
Test_and_test-and-set code sequence to solve all compareAndSet operations.

-------------

PR: https://git.openjdk.java.net/jdk/pull/1070

Reply via email to