[concurrency-interest] Unsynchronized lazy conditions

Shevek shevek at anarres.org
Thu May 31 01:07:09 EDT 2018


Hi,

I'd like to issue a warning message a relatively low number of times in 
a multi-threaded application. My code is this:

class Foo {
   private boolean warned;

   public void run() {
     if (!warned) {
        LOG.warn("Warning");
        warned = true;
     }
   }
}

This is the only access to the variable 'warned', the value change is 
deliberately unsynchronized, and monotonic. Am I right to believe that:

* The first call WILL issue a warning.
* Any thread will issue the warning AT MOST once.
* Some (later) threads may not issue the warning, if the updated value 
is flushed to the heap and they load it?

Is there a better way to do this without sacrificing performance? Is 
this what the mysterious AtomicBoolean.lazySet, or even 
weakCompareAndSet is about?

This is right in the middle of something very concurrent which runs for 
a long time, so reducing overhead is far more important than 
occasionally issuing too many warnings.

Thank you.

S.


More information about the Concurrency-interest mailing list