Draft JEP on enhanced volatiles

Noctarius me at noctarius.com
Fri Feb 7 18:43:49 UTC 2014


Hey Doug,

The syntax is definitely weird and unusual but from users point I
think I could live with that :)

Thanks for this proposal, absolutely something we were waiting for.

Chris

Am 07.02.2014 19:36, schrieb Doug Lea:
> 
> [To core-libs-dev; separately cross-posted to hotspot-dev and 
> compiler-dev.]
> 
> Now that the JMM update project is live (see
> http://openjdk.java.net/projects/jmm/), it would be helpful to
> get some preliminary feedback on one of its sure-to-be-needed
> counterparts: finally supporting a reasonable way to express
> atomic and/or ordered access operations beyond
> volatile-read/write. Some of you might know that the lack of
> these has often been discusses as a source of frustration and
> problems. One reason for nopt dealing with it sooner is the
> lack of a basis for even specifying such things, to be fixed
> with JMM update. But we also need some way for people to
> express them. The only good means for doing so appear to
> require a small amount of syntax support. Most people who have
> seen it seem to agree that the ".volatile" proposal below is
> the approach most likely to succeed. (We've considered a lot of
> others.) I'm hoping that members of libs, hotspot, and compiler
> groups can give it a sanity check before submitting (hopefully
> in a week or so). Thanks!
> 
> Draft JEP proposal Title: Enhanced Volatiles Author: Doug Lea 
> [...other metadata elided for now...]
> 
> 
> Summary -------
> 
> This JEP results in a means for programmers to invoke the
> equivalents of java.util.concurrent.atomic methods on volatile
> fields.
> 
> Motivation ----------
> 
> As concurrent and parallel programming in Java continue to
> expand, programmers are increasingly frustrated by not being
> able to use Java constructions for arranging atomic operations
> for the fields of individual classes; for example atomically
> incrementing a "count" field. Until now the only ways to
> achieve these effects were to use a stand-alone AtomicInteger
> (adding both space overhead and additional concurrency issues
> to manage indirection) or, in some situations, to use atomic
> FieldUpdates (often encountering more overhead than the 
> operation itself), or to use JVM Unsafe intrinsics. Because
> intrinsics are preferable on performance grounds, their use has
> been increasingly common, to the detriment of safety and
> portability. Without this JEP, these problems are expected to
> become worse as atomic APIs expand to cover additional access
> consistency policies (aligned with the recent C++11 memory
> model) as part of Java Memory Model revisions.
> 
> Description -----------
> 
> The target solution requires a syntax enhancement, a few 
> library enhancements, and compiler support.
> 
> We model the extended operations on volatile integers via an
> interface VolatileInt, that also captures the functionality of
> AtomicInteger (which will also be updated to reflect Java
> Memory Model revisions as part of this JEP). A tentative
> version is below. Similar interfaces are needed for other
> primitive and reference types.
> 
> We then enable access to corresponding methods for (typically 
> volatile) fields using the ".volatile" prefix. For example:
> 
> class Usage { volatile int count; int incrementCount() { return
> count.volatile.incrementAndGet(); } }
> 
> The ".volatile" syntax is slightly unusual, but we are
> confident that it is syntactically unambiguous and semantically
> specifiable.  New syntax is required to avoid ambiguities with
> existing usages, especially for volatile references --
> invocations of methods on the reference versus the referent
> would be indistinguishable.  The ".volatile" prefix introduces
> a scope for operations on these "L-values", not their retrieved
> contents.  However, just using the prefix itself without a
> method invocation (as in "count.volatile;") would be
> meaningless and illegal.  We also expect to allow volatile 
> operations on array elements in addition to fields.
> 
> The main task is to translate these calls into corresponding
> JVM intrinsics. The most likely option is for the source
> compiler to use method handles. This and other techniques are
> known to suffice, but are subject to further exploration. Minor
> enhancements to intrinsics and a few additional JDK library
> methods may also be needed.
> 
> Here is a tentative VolatileInt interface.  Those for other
> types are similar.  The final released versions will surely
> differ in small ways.
> 
> interface VolatileInt { int get(); int getRelaxed(); int
> getAcquire(); int getSequential();
> 
> void set(int x); void setRelaxed(int x); void setRelease(int
> x); void setSequential(int x);
> 
> int getAndSet(int x); boolean compareAndSet(int e, int x); 
> boolean compareAndSetAcquire(int e, int x); boolean
> compareAndSetRelease(int e, int x); boolean
> weakCompareAndSet(int e, int x); boolean
> weakCompareAndSetAcquire(int e, int x); boolean
> weakCompareAndSetRelease(int e, int x);
> 
> int getAndAdd(int x); int addAndGet(int x); int
> getAndIncrement(); int incrementAndGet(); int
> getAndDecrement(); int decrementAndGet(); }
> 
> 
> Alternatives ------------
> 
> We considered instead introducing new forms of "value type"
> that support volatile operations. However, this would be
> inconsistent with properties of other types, and would also
> require more effort for programmers to use. We also considered
> expanding reliance on java.util.concurrent.atomic
> FieldUpdaters, but their dynamic overhead and usage limitations
> make them unsuitable. Several other alternatives (including
> those based on field references) have been raised and dismissed
> as unworkable on syntactic, efficiency, and/or usability 
> grounds over the many years that these issues has been
> discussed.
> 
> 
> Risks and Assumptions ---------------------
> 
> We are confident of feasibility.  However, we expect that it
> will require more experimentation to arrive at compilation
> techniques that result in efficient enough implementation for
> routine use in the performance-critical contexts where these
> constructs are most often needed. The use of method handles may
> be impacted by and may impact JVM method handle support.
> 
> Impact ------
> 
> A large number of usages in java.util.concurrent (and a few
> elsewhere in JDK) could be simplified and updated to use this
> support.
> 




More information about the core-libs-dev mailing list