On 1/13/20 4:44 PM, Tobi Ajila wrote: > Hi John > > Given that inline types can be flattened there is a possibility that > data races will occur in places where users were not expecting it > before. So your `__AlwaysAtomic` modifier is a necessary tool as the > existing spec will only enforce atomicity for 32bit primitives and > references. I just want to confirm if the intention of the > __AlwaysAtomic bit on an inline class is only to ensure atomic reads and > writes of inline types and that there are no happens-before ordering > expectations as there are with the existing volatile modifier on fields. >
In which case "__AlwaysOpaque" would be a more accurate term. -Doug > For example: > > ``` > __AlwaysAtomic inline class Long256 { long v1, v2, v3 ,v4; … } > > class Example { > Long256 bigLong; > int x; > int y; > > void method() { > Long256 newLong = new Long256(1, 2, 3, 4); > > x = 1; > > > //compiler is still free to re-order write to bigLong with respect > //to writes to x and y, but the write to bigLong must be done atomically > bigLong = newLong; > > y = 2; > } > } > ``` > > Does this match your expectations? > > The reason I ask is because of the "Protection is “as if” each field > were volatile" wording in your previous note. Does this only speak to > the atomicity properties of the volatile modifier? Or do you intend > further constraints? > > Regards, > --Tobi > > > "valhalla-spec-experts" <valhalla-spec-experts-boun...@openjdk.java.net> > wrote on 2019/12/18 08:46:42 PM: > >> From: John Rose <john.r.r...@oracle.com> >> To: valhalla-spec-experts <valhalla-spec-experts@openjdk.java.net> >> Date: 2019/12/18 08:47 PM >> Subject: [EXTERNAL] atomicity for value types >> Sent by: "valhalla-spec-experts" <valhalla-spec-experts- >> boun...@openjdk.java.net> >> >> In a nutshell, here’s a proposal for value type atomicity: >> >> - Define a contextual keyword “alwaysatomic" (working title > “__AlwaysAtomic”). >> - It can only occur with “inline” in class declaration. >> - All instances of the given inline class are protected against races. >> - Protection is “as if” each field were volatile, “and the same” for >> array elements. >> - In the class file the ACC_VOLATILE bit is used (0x0040) to record >> the keyword. >> - This bit does not necessarily disable flattening; if the JVM can >> get away with flattening it should. >> - The JVM can get away with flattening such values on stack, in >> registers, and perhaps in final heap variables. >> - The JVM can get away with flattening such values if they are >> “naturally atomic”, meaning they can be wholly loaded or stored in >> one (atomic) hardware instruction. >> >> More details to follow. Here’s a backgrounder I wrote a while ago: >> >> INVALID URI REMOVED >> > u=http-3A__cr.openjdk.java.net_-7Ejrose_oblog_value-2Dtearing.html&d=DwIFaQ&c=jf_iaSHvJObTbx- >> > siA1ZOg&r=erClOruSa3K4FS7XawcTd7k9ZbtVLiryTZ1WIpneMMg&m=9WXy2DpynXX2sj1FbCiuW127ablyOD_EN13- >> aS4ug04&s=dhRZz0Da6RYg45c_b-x6gFBP0sqXC1VtTWP--BDHMS4&e= >> >> — John >> >> >