看代码!看代码!
/**
* 单例:在某些场景下,需要获取同一个对象
* public static Sington SINGTON = new Sington();
* //类加载在JVM内部执行
* (1)只执行一次,(2)线程安全
*/
public class Sington {
//饿汉模式,在类加载的时候,就创建对象(是线程安全的)
public static Sington SINGTON = new Sington();
private Sington() {
}
public static Sington getInstance(){
return SINGTON;
}
//懒汉式
public static Sington SINGTON2;
//省略了构造方法
//懒汉式的写法存在线程安全问题
//多行代码,并且存在需要分解的代码行 --》不具备原子性也不具备可见性
public static Sington getInstance2(){
if(SINGTON2 == null){
SINGTON2 = new Sington();
//可以分解为多条语句据
//(1)给对象分配内存空间
//(2)再执行对象的初始化方法
//(3)在堆里产生对象以后,把之前的对象(对象的引用对象)指向生成的对象(SINGTON2指向new出来的象,)
}
return SINGTON2;
}
//3, //懒汉式的线程安全写法
public static Sington SINGTON3;
public synchronized static Sington getInstance3(){
if(SINGTON3 == null)
SINGTON3 = new Sington();
return SINGTON3;
}
//双重校验锁的单例模式
public volatile static Sington SINGTON4;
public synchronized static Sington getInstance4(){
if(SINGTON4 == null) {
synchronized (Sington.class) {
if (SINGTON4 == null) {
SINGTON4 = new Sington();
}
}
}
return SINGTON4;
}
}