I don't know how common it is, but it's something I use a lot ;) Yes, it avoids sync.
-JZ On Jul 10, 2013, at 7:40 AM, chao chu <[email protected]> wrote: > Hi Jordan, > > Please forgive my ignorance, in the below code, it's just used to avoid > unnecessary synchronizations? > > I didn't see similar code before, is this a common pattern/idiom in Java? > Thanks > > > > // first helper is synchronized when getZooKeeper is called. > Subsequent calls > // are not synchronized. > > > helper = new Helper() > > > { > private volatile ZooKeeper zooKeeperHandle = null; > > > private volatile String connectionString = null; > > > > @Override > public ZooKeeper getZooKeeper() throws Exception > > > { > synchronized(this) > > > { > if ( zooKeeperHandle == null ) > > > { > connectionString = > ensembleProvider.getConnectionString(); > > > zooKeeperHandle = > zookeeperFactory.newZooKeeper(connectionString, sessionTimeout, watcher, > canBeReadOnly); > > > } > > > > helper = new Helper() > > > { > @Override > > > public ZooKeeper getZooKeeper() throws Exception > > > { > return zooKeeperHandle; > > > } > > > > @Override > public String getConnectionString() > > > { > return connectionString; > > > } > }; > > > > return zooKeeperHandle; > > > } > } > > > > @Override > public String getConnectionString() > > > { > return connectionString; > > > } > }; > > > > -- > ChuChao
