[concurrency-interest] Using a volatile variable as a "guard"

Joe Bowbeer joe.bowbeer at gmail.com
Mon Feb 7 03:57:27 EST 2011

You got it.

For the specifics, see and Ch. 17 in the Java Language Spec.


In practice, it would be clearer to declare factory to be volatile and to
replace isNuclearFactory by a getType() method in the Factory class.


On Mon, Feb 7, 2011 at 12:24 AM, Yan Cheng CHEOK wrote:

> Hello all,
> I came across the article "Java theory and practice: Fixing the Java Memory
> Model, Part 2", by Brian Goetz.
> I hope I understand section "New guarantees for volatile" correctly.
> I try to use a similar technique as Brian Goetz's. My objective is :
> A) Never execute factory's operate member function, if it is a
> NuclearFactory.
> Hence, I try to turn on volatile guard variable isNuclearFactor, before I
> attempt to construct nuclear factory. This is different from Brian Goetz's.
> Brian Goetz only write to volatile variable, after he had finished
> constructed configOptions.
> I feel the following code should work, based on the information picked from
> Brian Goetz's article.
> ""Under the new memory model, when thread A writes to a volatile variable
> V, and thread B reads from V, any variable values that were visible to A at
> the time that V was written are guaranteed now to be visible to B""
> when thread A writes to volatile isNuclearFactory, and thread B reads from
> isNuclearFactory, factory was visible to A as FoodFactory at the time that
> isNuclearFactory was written. Hence, factory are guranteed now to be visible
> to B as FoodFactory too.
> I hope I am getting this correctly. Or, do I need to mark factory as
> volatile too?
> void fun_by_thread_A() {
>    this.isNuclearFactory = true;
>    this.factory = new NuclearFactory();
> }
> void fun_by_thread_B() {
>    Factory _factory = this.factory;
>    if (this.isNuclearFactory) {
>        // Do not operate nuclear factory!!!
>        return;
>    }
>    // If out-of-order execution happens, _factory might
>    // be NuclearFactory instance.
>    _factory.operate();
> }
> Factory factory = new FoodFactory();
> volatile boolean isNuclearFactory = false;
> Thanks and Regards
> Yan Cheng CHEOK
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://cs.oswego.edu/pipermail/concurrency-interest/attachments/20110207/529e11f6/attachment.html>

More information about the Concurrency-interest mailing list