public Instance() {
System.out.println(“init…”);
}
}
package com.lizba.p1;
/**
-
-
延迟初始化
-
@Author: Liziba
-
@Date: 2021/6/12 22:40
*/
public class UnsafeLazyInitialization {
private static Instance instance;
public static Instance getInstance() {
if (instance == null) { // 1、线程A执行
instance = new Instance(); // 2、线程B执行
}
return instance;
}
}
在UnsafeLazyInitialization类中,假设线程A执行1的同时线程B执行2,此时线程A可能会看到Instance对象未完成初始化(后续会讲问题根源)。
同步处理解决方法:
package com.lizba.p1;
/**
-
-
@Author: Liziba
-
@Date: 2021/6/12 22:46
*/
public class SafeLazyInitialization {
private static Instance instance;
public synchronized static Instance getInstance() {
if (instance == null) { // 线程A执行
instance = new Instance(); // 线程B执行
}
return instance;
}
}
给getInstance()方法做了同步处理,synchronized会带来性能开销。在getInstance()调用不频繁的情况下,这种解决方案是可以接收的,但是如果getInstance()被频繁调用,程序的整体性能将会下降。(尤其是在早期JV