[concurrency-interest] Here's why Atomic*FieldReference access checking is broken

Peter Levart peter.levart at gmail.com
Wed Oct 8 09:38:52 UTC 2014


On 10/05/2014 10:44 PM, Peter Levart wrote:
> The 3rd report shows a result of experimental 
> AtomicIntegerFieldUpdater implementation which loads new VM-anonymous 
> class for each new instance which allows VM compiler to specialize 
> code for a particular field. Such implementation is nearly as fast as 
> Java field access. This is just a proof of concept. A little hack-ish, 
> doesn't include the fix for the overly restrictive protected access 
> yet, but here it is if anyone is interested:
>
> http://cr.openjdk.java.net/~plevart/jdk9-dev/AtomicFieldUpdater.AccessChecks/AnonClassPerInstance/AtomicIntegerFieldUpdater.java 
>

Hi,

I experimented further with this.

It seems that making 'offset' a static final field is not necessary to 
get optimal performance out of specialized one-class-per-instance 
Atomic*FieldUpdater. Only the 'cclass' field used in check matters. So 
'offset' can be pushed up to abstract Atomic*FieldUpdaterImpl as a final 
instance field. Now that specialized subclass of Atomic*FieldUpdaterImpl 
is only 'cclass' specific, it can be shared among instances that use the 
same 'cclass'. That means only one VM-anonymous subclass per target 
class (or subclass/caller of target class when protected access is 
involved). The VM-anonymous subclass is cached using ClassValue:

http://cr.openjdk.java.net/~plevart/jdk9-dev/AtomicFieldUpdater.AccessChecks/AnonClassPerCclass/AtomicIntegerFieldUpdater.java

I seems that with such Atomic*FieldUpdater there is no compelling reason 
to use Unsafe directly as there is almost no additional runtime 
overhead. The only method that is about 30% slower than Java counterpart 
is get(), but there's hardly a reason to use it instead of simple Java 
volatile field read.

Regards, Peter




More information about the security-dev mailing list