xiaoemo0 2019-11-08
public class SingletonTest {
}
// 懒汉式不会预先创建对象,只有在第一次调用时才创建对象
// 一篇讲解懒汉式的博文,https://www.cnblogs.com/sunny...
//懒汉式,线程不安全
class Singleton1 {
private static Singleton1 instance; private Singleton1(){} public static Singleton1 getInstance(){ if(instance == null) { instance = new Singleton1(); } return instance; }
}
//懒汉式,线程安全, 同步方法
class Singleton2{
private static Singleton2 instance; private Singleton2(){} public static synchronized Singleton2 getInstance(){ if(instance == null) { instance = new Singleton2(); } return instance; }
}
//懒汉式,线程安全;同步代码块 减少同步锁颗粒度
class Singleton3{
private static Singleton3 instance; private Singleton3(){} public static Singleton3 getInstance(){ if(instance == null) { synchronized(Singleton3.class) { instance = new Singleton3(); } } return instance; }
}
//懒汉式,线程安全;进一步优化
class Singleton4{
private static Singleton4 instance; private Singleton4(){} public static Singleton4 getInstance() { if(instance == null) { synchronized(Singleton4.class) { if(instance == null) { instance = new Singleton4(); } } } return instance; }
}
//懒汉式,线程安全; volatile 禁止指令重排序
class Singleton5{
private static volatile Singleton5 instance; private Singleton5(){} public static Singleton5 getInstance(){ if(instance == null) { synchronized(Singleton5.class) { if(instance == null) { instance = new Singleton5(); } } } return instance; }
}
//饿汉式不管有没有调用getInstance()方法,都会预先在系统中创建一个静态对象; 线程安全
//参考 https://www.cnblogs.com/sunny...
class Singleton6{
private Singleton6(){} private static Singleton6 instance = new Singleton6(); public static Singleton6 getInstance() { return instance; }
}