Java Double check locking, does this code work?

165 Views Asked by At

I have read The "Double-Checked Locking is Broken" Declaration. But I wonder if i create the object by a function, will that be ok?

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

There are 1 best solutions below

2
On

No it will not make a difference adding a function will not make any difference. And your function is doing nothing.

However if you declare it as volatile it will start working from Java 1.5

private volatile Helper helper = null;

One of the correct way of Lazy initialization in java is Initialization-on-demand holder idiom .This relies on the fact that inner classes are not loaded until they are referenced.

class Foo {
    private static class HelperHolder {
        public static Helper helper = new Helper();
    }

    public static Helper getHelper() {
        return HelperHolder.helper;
    }
}