Double-checked Locking (DCL)用来在lazy initialisation 的单例模式中避免同步开销的一个方法。
下面是这么做的一个例子。
- public class MyFactory {
- private static MyFactory instance;
- public synchronized static MyFactory getFactory() {
- if (instance == null)
- instance = new MyFactory();
- return instance;
- }
- }
上面的例子是完全正确的。但是考虑到所有的Read操作也需要同步,为了避免昂贵的同步开销,似乎有如下做法:
- public class MyBrokenFactory {
- private static MyFactory instance;
- private int field1, field2 ...
- public static MyBrokenFactory getFactory() {
- // This is incorrect: don't do it at home, kids!