public class Sinleton {
private static Sinleton instance;
public static Sinleton getInstance(){
if (instance == null){
instance = new Sinleton();
return instance;
}
return instance;
}
}
正常的懒汉式是没有线程安全的,如果多个线程都创建该对象,会创建出许多对象,不利于线程安全,若要具备线程安全需要对创建对象部份加锁,使只该对象在系统内只存在一份。
public class Sinleton {
private static volatile Sinleton instance;
public static Sinleton getInstance(){
if (instance == null){
synchronized (Sinleton.class){
instance = new Sinleton();
return instance;
}
}
return instance;
}
}
这样上锁后发现虽然if排除了instance不等于空这种情况,但所有线程在等待后依旧会创建新的对象,如果将锁挪到if外面呢?
public class Sinleton {
private static volatile Sinleton instance;
public static Sinleton getInstance(){
synchronized (Sinleton.class){
if (instance == null){
instance = new Sinleton();
return instance;
}
}
return instance;
}
}
如果像这样挪到外面,可以避免创建多个对象,但每个线程在排队后,都需要进行判空操作,所以要进行修改
public class Sinleton {
//加volatile防止指令重排
private static volatile Sinleton instance;
public static Sinleton getInstance(){
//第一个判断防止等待,已经有对象了直接返回
if (instance == null){
synchronized (Sinleton.class){
//防止其他线程再创建对象,如果不加,所有判断后的线程经过等待都会创建对象
if (instance == null){
instance = new Sinleton();
return instance;
}
}
}
return instance;
}
}
这样就完成了