Does anybody understand what could go wrong if that CHM.Node.value volatile write is relaxed to storeFence + normal write, and no fence at all within the CHM.Node constructor (Hotspot JVM only)?
On Mon, 19 Nov 2018, 10:28 Jean-Philippe BEMPEL <[email protected] wrote: > Thanks Vladimir for your thoroughly explanation, I need to re read the > Aleksey's JMM pragmatics 10 times more I guess 🙄 > > On Sun, Nov 18, 2018 at 7:35 PM Vladimir Sitnikov < > [email protected]> wrote: > >> Jean-Philippe>is a write to value but no read of this va lue inside the >> same thread, so the write is free to be reordered >> >> It ("reordering") does not really matter. >> >> For instance, >> >> 17.4.5. Happens-before Order> If the reordering produces results >> consistent with a legal execution, it is not illegal. >> >> What matters is the set of possible "writes" that given "read" is allowed >> to observe. >> >> >> In this case, simple transitivity is enough to establish hb. >> As Gil highlights, "negations" are a bit hard to deal with, and Mr.Alexey >> converts the negations to a positive clauses: >> https://shipilev.net/blog/2014/jmm-pragmatics/#_happens_before >> >> Shipilёv> Therefore, in the absence of races, we can only see the latest >> write in HB. >> >> Note: we (as programmers) do not really care HOW the runtime and/or CPU >> would make that possible. We have guarantees from JVM that "in the absence >> of races, we can only see the latest write in HB". >> CPU can reorder things and/or execute multiple instructions in parallel. >> I don't really need to know the way it is implemented in order to prove >> that "CHM is fine to share objects across threads". >> >> Just in case: there are two writes for w.value field. >> "write1" is "the write of default value" which "synchronizes-with the >> first action in every thread" (see 17.4.4.) + "If an action x >> synchronizes-with a following action y, then we also have hb(x, y)." (see >> 17.4.5) >> "write2" is "w.value=42" >> >> "value=0" (write1) happens-before "w.value=42" (write2) by definition >> (17.4.4+17.4.5) >> w.value=42 happens-before map.put (program order implies happens-before) >> read of u.value happens-before map.put (CHM guarantees that) >> >> In other words, "w.value=42" is the latest write in hb order for u.value >> read, so u.value must observe 42. >> JRE must ensure that the only possible outcome for the program in >> question is 42. >> >> Vladimir >> >> -- >> You received this message because you are subscribed to the Google Groups >> "mechanical-sympathy" group. >> To unsubscribe from this group and stop receiving emails from it, send an >> email to [email protected]. >> For more options, visit https://groups.google.com/d/optout. >> > -- > You received this message because you are subscribed to the Google Groups > "mechanical-sympathy" group. > To unsubscribe from this group and stop receiving emails from it, send an > email to [email protected]. > For more options, visit https://groups.google.com/d/optout. > -- You received this message because you are subscribed to the Google Groups "mechanical-sympathy" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
