United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
JDK-7023898 : Intrinsify AtomicLongFieldUpdater.getAndIncrement()

Details
Type:
Enhancement
Submit Date:
2011-03-02
Status:
Resolved
Updated Date:
2013-06-26
Project Name:
JDK
Resolved Date:
2012-09-21
Component:
hotspot
OS:
generic
Sub-Component:
compiler
CPU:
x86
Priority:
P3
Resolution:
Fixed
Affected Versions:
hs21
Fixed Versions:
hs25 (b03)

Related Reports
Backport:
Backport:
Backport:
Backport:
Backport:
Backport:
Relates:
Relates:
Relates:

Sub Tasks

Description
java.util.concurrent.atomic/Atomic*.getAndIncrement() and getAndAdd() are currently
implemented as CAS loops.  On x86/x64, these could be intrinsified into lock:xadd.
The latter is far less heavy-weight than cmpxchg.
After discussions with Doug Lea and Dave Dice, we should extend Unsafe a bit to provide intrinsifiable operations to take advantage of xadd and xchg.  Here's the rough interface addition.  These are slightly different than normal Unsafe since they start with Java implementations which are always valid.  They can be replaced with intrinsics if the platform provides a fast implementation.

   /**
    * Atomically update Java variable by <tt>delta</tt> returning
    * the previous value.
    * @return the previous value
    */
   public int getAndAddInt(Object o, long offset, int delta) {
       for (;;) {
           int current = getInt(o, offset);
           int next = current + delta;
           if (compareAndSwapInt(o, offset, current, next)) {
               return current;
           }
       }
   }

   /**
    * Atomically update Java variable by <tt>delta</tt> returning
    * the previous value.
    * @return the previous value
    */
   public long getAndAddLong(Object o, long offset, long delta) {
       for (;;) {
           long current = getLongVolatile(o, offset);
           long next = current + delta;
           if (compareAndSwapLong(o, offset, current, next)) {
               return current;
           }
       }
   }

   /**
    * Atomically sets the field of the given object at the given offset
    * to the given value and returns the old value.
    *
    * @param o An object whose field to get and set
    * @param newValue the new value
    * @return the previous value
    */
   public int getAndSet(Object o, long offset, int newValue) {
       for (;;) {
           int current = getInt(o, offset);
           if (compareAndSwapInt(o, offset, current, newValue)) {
               return current;
           }
       }
   }
   /**
    * Atomically sets the field of the given object at the given offset
    * to the given value and returns the old value.
    *
    * @param o An object whose field to get and set
    * @param newValue the new value
    * @return the previous value
    */
   public long getAndSet(Object o, long offset, long newValue) {
       for (;;) {
           long current = getLongVolatile(o, offset);
           if (compareAndSwapLong(o, offset, current, newValue)) {
               return current;
           }
       }
   }
   /**
    * Atomically sets the field of the given object at the given offset
    * to the given value and returns the old value.
    *
    * @param o An object whose field to get and set
    * @param newValue the new value
    * @return the previous value
    */
   public Object getAndSet(Object o, long offset, Object newValue) {
       for (;;) {
           Object current = getObject(o, offset);
           if (compareAndSwapObject(o, offset, current, newValue)) {
               return current;
           }
       }
   }

                                    

Comments
PUBLIC COMMENTS

See http://blogs.oracle.com/dave/entry/atomic_fetch_and_add_vs
                                     
2011-06-13
EVALUATION

See description.
                                     
2012-03-20
EVALUATION

http://hg.openjdk.java.net/hsx/hotspot-comp/hotspot/rev/7eca5de9e0b6
                                     
2012-09-20
URL:   http://hg.openjdk.java.net/hsx/hotspot-main/hotspot/rev/7eca5de9e0b6
User:  kvn
Date:  2012-09-28 19:34:46 +0000

                                     
2012-09-28
We seem to have lost the actual Unsafe.java changes that this work supports. Was CR/RFE for that ever created?
                                     
2012-11-25
David: no CR was created as far as I know.
                                     
2012-12-03
David, Roland, I had filed JDK-8004330 for this.
                                     
2012-12-03



Hardware and Software, Engineered to Work Together