On Aug 21, 2013, at 4:37 PM, Brian Burkhalter <brian.burkhal...@oracle.com> 
wrote:

> With respect to this issue
> 
> http://bugs.sun.com/view_bug.do?bug_id=6470700
> 
> the code of concern from java.lang.Math is
> 
> 701    private static Random randomNumberGenerator;
> 702
> 703    private static synchronized Random initRNG() {
> 704        Random rnd = randomNumberGenerator;
> 705        return (rnd == null) ? (randomNumberGenerator = new Random()) : 
> rnd;
> 706     }
> 
> 731    public static double random() {
> 732        Random rnd = randomNumberGenerator;
> 733        if (rnd == null) rnd = initRNG();
> 734        return rnd.nextDouble();
> 735    }
> 
> where the class variable "randomNumberGenerator" is not used anywhere else in 
> the class. The complaint is that this is an instance of the broken 
> double-checked locking pattern. While at first glance this might appear to be 
> the case, it does not seem so to me. It looks more like an attempt to avoid 
> calling a synchronized method if "randomNumberGenerator" has already been 
> initialized.


This looks very much like the "Broken multithreaded version" from
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html

// Broken multithreaded version
// "Double-Checked Locking" idiom
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...
  }


"Unfortunately, that code just does not work in the presence of either 
optimizing compilers or shared memory multiprocessors."

Reply via email to