This is a truly fascinating thread of discussion.  However, from reading the
article _The "Double-Checked Locking is Broken" Declaration_
(http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)

It seems to me that the following code is thread safe.

if (_jspx_inited == false) {
    synchronized (this) {
        if (_jspx_inited == false) {
            _jspx_init();
            _jspx_inited = true;
        }
    }
}

The case described in the article is the following

class Foo {
  private Helper helper = null;
  public Helper getHelper() {
    if (helper == null)
      synchronized(this) {
        if (helper == null)
          helper = new Helper();
      }
    return helper;
    }
  // other functions and members...
  }
}

The problem is that helper may be assigned a value before the Helper
constructor executes.  Thus another thread may come along and notice a
non-null value for helper and attempt to use un-initialized values.

In the _jspx_inited case above the only requirement is that compiler can't
rewrite the code into the equivalent of

if (_jspx_inited == false) {
    synchronized (this) {
        if (_jspx_inited == false) {
            _jspx_inited = true;
            _jspx_init();
        }
    }
}

Such a re-ordering seems illegal to me (what if jspx_init() uses the value
of _jspx_inited?).  If, however, it is legal reordering then the example of
a "correct" double-check mechanism for 32-bit primitive values should work
here.  It would look something like

boolean tmpInited = _jspx_inited;
if (tmpInited == false) {
    synchronized (this) {
        if (tmpInited == false) {
            tmpInited = _jspx_init();  // NOTE:  _jspx_init() needs to
return true
            _jspx_inited = tmpInited;
        }
    }
}




---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, email: [EMAIL PROTECTED]

Reply via email to