//单例模式的四种实现方式
//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.不确定是否使用时,饿汉会占用内存;你想,不管饿不饿,就把人家当成饿死鬼做了一大锅馒头,人家不吃多特么浪费啊!~~