//单例模式的四种实现方式
//1.非线程安全
public class Test {
public static Test obj;
private Test(){};
public static Test getInstance() {
obj = new Test();
return obj;
}
}
//2.非线程安全,永远需要这个对象,但是类加载时就会初始化这个对象,占用内存
class Test2{
public static Test2 obj=new Test2();
private Test2(){};
public static Test2 getInstance(){
return obj;
}
}
//3.线程安全,慢
class Test3{
public static Test3 obj;
private Test3(){};
//每次获取对象都会走到这个“线程安全”的方法,等待获取锁,性能大减
public static synchronized Test3 getInstance(){
if(obj==null){
obj=new Test3();
return obj;
}
return obj;
}
}
//4.线程安全,快
class Test4{
public static volatile Test4 obj; // 对obj的判断和操作都在主存进行
private Test4(){};
public static Test4 getInstance(){// 多个线程可以共用这个方法
if(obj==null){ //对象创建成功后,并发量大增
synchronized (Test4.class){
if(obj==null){
obj=new Test4();
return obj;
}
}
}
return obj;
}
}
注:第二种为“饿汉式”实现方法,即不管用不用这个对象,都在类加载时创建:
1.优 点,场景为经常使用时,使用这种方式;
2.不确定是否使用时,饿汉会占用内存;你想,不管饿不饿,就把人家当成饿死鬼做了一大锅馒头,人家不吃多特么浪费啊!~~