饿汉模式
public class HungerSingleton {
private static final HungerSingleton hungerSingleton=new HungerSingleton();//类加载前即被实例化且仅有一次
private HungerSingleton() {
System.out.println("饿汉模式实例正在被创建");
}
public static HungerSingleton getHungerSingleton(){
return hungerSingleton;
}
}
懒汉模式
public class LazySingleton {
private static LazySingleton lazySingleton;
private LazySingleton (){
System.out.println("懒汉模式正在创建实例");
}
public static synchronized LazySingleton getLazySingleton(){ 某一线程得到锁后才能执行且未得到锁的线程不能执行
if(lazySingleton==null){ //得到锁的线程创建实例前先判断是否已经有实例 若无则创建 若有则直接返回实例
lazySingleton=new LazySingleton();
return lazySingleton;
}
return lazySingleton;
}
}
双if检测模式
public class locksingleton {
private static locksingleton singleton;
private locksingleton(){System.out.println("双检测模式正在创建实例"); };
public static locksingleton getLocksingletion (){
if (singleton==null) synchronized (locksingleton.class){ //线程获得锁前和获得锁后都会检测单例是否已经实例化
if (singleton==null)singleton=new locksingleton();
}
return singleton;
}
}
静态内部类模式
public class classSingletion {
private static class letion {
private final static classSingletion instance=new classSingletion();//内部类被加载前被创建并作为初值赋值给instance 且这个创建复赋值过程只进行一次
}
private classSingletion(){System.out.println("内部静态类模式正在创建实例");}
public static classSingletion getClassSingletion(){
return letion.instance;
}
}
多线程测试结果
如图:开启了八个线程去不断地获得单例的实例,结果每个单例的对象只实例化一次 可见线程安全