1. 饿汉模式
public class S{
private S(){}
private static S s=new S();
public static S get(){
return s;
}
}
线程安全,加载时就初始化,根据需求来,此种用法最简单
2. 懒汉模式
public class S{
private S(){}
private static S s;
public static S get(){
if(s==null){
s=new S();
}
return s;
}
}
线程不安全,会出现多个线程同时进入if判断
方法上加 synchronized 字段,可以线程安全,但是多线程性能较低,因为即使以已经创建过示例,也会锁住该方法
3. 双重检验锁
public class S{
private S(){}
private volatile static S s;
public static S get(){
if(s == null){
synchronized(S.class){
if(s == null){
s=new S();
}
}
}
return s;
}
}
线程安全。
如果不加第二个null检验,也会出现创建多个实例的情况,多个线程可以同时进入第一个null检测代码块,都会执行创建语句,只是顺序执行而已
如果不加volatile 关键字,则第二个null检测时,s可能是线程栈内的副本,不是主内存中的值,而主内存中的值已被其他线程实例化,会出现多次创建实例。
4. 静态内部类
public class S{
private S(){}
private static class I{
private static final S INSTANCE =new S();
}
public static S get(){
return I.INSTANCE ;
}
}
线程安全
5. 枚举类
public enum S{
INSTANCE;
public void dosomething(){
}
}
//调用
main(){
S s=S.INSTANCE;
s.dosomething();
}