[concurrency-interest] AtomicReferenceFieldUpdater vs Unsafe

Dr Heinz M. Kabutz heinz at javaspecialists.eu
Wed Nov 16 16:37:04 EST 2011

In Java 6, classes like ConcurrentLinkedQueue and SynchronousQueue used 
the AtomicReferenceFieldUpdater to update the next, head, etc. fields.

In Java 7, this was changed to instead use Unsafe.compareAndSwapObject() 

The AtomicReferenceFieldUpdater does a bunch of error checking every 
time it is called, like this:

            if (obj == null || obj.getClass() != tclass || cclass != null ||
                (update != null && vclass != null &&
                 vclass != update.getClass()))
                updateCheck(obj, update);
            return unsafe.compareAndSwapObject(obj, offset, expect, update);

My thinking is that the programmers changing ConcurrentLinkedQueue et al 
probably wanted to improve the performance by not having to do all that 
checking every time it is called.  The Unsafe.compareAndSwapObject() 
method is probably compiled to a single CPU instruction.

Is that correct?

Is there any other reason for this change?


Dr Heinz M. Kabutz (PhD CompSci)
Author of "The Java(tm) Specialists' Newsletter"
Sun Java Champion
IEEE Certified Software Development Professional
Tel: +30 69 72 850 460
Skype: kabutz

More information about the Concurrency-interest mailing list