单例的线程安全问题
单例的两种形式:懒汉式和饿汉式
饿汉式只有被调用时才创建对象,节约资源。
//懒汉式 没有安全问题
class Single{
private static final Single single=new Single();
public Single() {
}
public static Single getInstance(){
return single;
}
}
//饿汉式 存在线程安全问题
class Single2{
private static Single2 single=null;
public Single2() {
}
public static Single2 getInstance(){
//存在线程安全
if (single!=null){
single=new Single2();
}
return single;
}
}
我们为饿汉式单例添加同步锁来解决线程安全问题
public static Single2 getInstance(){
synchronized (Single2.class) {
//存在线程安全
if (single != null) {
single = new Single2();
}
}
return single;
}
但是同步使性能减低,带来了性能问题。
解决办法:多加一次判断。
public static Single2 getInstance(){
if (single!=null) {
synchronized (Single2.class) {
//存在线程安全
if (single != null) {
single = new Single2();
}
}
}
return single;
}