总的来说,应该有4中(说的不对请多见谅)
- 1、饿汉式:可能会浪费资源
/**
* 饿汉式
*/
public class SignleVersion1 {
private static SignleVersion1 signle = new SignleVersion1();
private SignleVersion1(){}
public static SignleVersion1 getInstance(){
return signle;
}
}
- 2、双重检查锁:注意volatile关键字,如果不加volatile,由于jvm的指令重排,可能在对象没有初始化完毕时便被发布,可能会引异常
public class SignleVersion2 {
private volatile static SignleVersion2 signle;
private SignleVersion2(){
}
public static SignleVersion2 getInstance(){
if (signle==null){
synchronized (SignleVersion2.class){
if (signle==null){
signle = new SignleVersion2();
}
}
}
return signle;
}
}
- 3、内部类:基于java加载类的机制,内部类只有在第一次调用时才会加载
/**
* 内部类
*/
public class SignleVersion3 {
private SignleVersion3(){
}
private static class Inner{
public static SignleVersion3 signleVersion3 = new SignleVersion3();
}
public static SignleVersion3 getInstance(){
return Inner.signleVersion3;
}
}
- 4、枚举模式:天生线程安全,effective java作者力荐
/**
* 枚举模式
*/
public class SignleVersion4 {
private SignleVersion4(){}
private enum Signle{
INSTANCE,
;
Signle(){
this.signle = new SignleVersion4();
}
private SignleVersion4 signle;
public SignleVersion4 getSignle() {
return signle;
}
}
public static SignleVersion4 getInstance(){
return Signle.INSTANCE.getSignle();
}
}