1.饿汉
package jstudy.concur.single;
public class Singleton1 {
private static Singleton1 instance = new Singleton1();
private Singleton1(){}
public static Singleton1 getInstance(){
return instance;
}
}
2.1普通懒汉
public class Singleton1 {
private static Singleton1 instance = null;
private Singleton1(){}
public static Singleton1 getInstance1(){
if(instance == null){
instance = new Singleton1();
}
return instance;
}
public static synchronized Singleton1 getInstance2(){
if (instance == null){
instance = new Singleton1();
}
return instance;
}
2.2 双重校验锁DCL
package jstudy.concur.single;
public class Singleton2 {
private volatile static Singleton2 instance = null;
private Singleton2(){}
public static Singleton2 getInstance(){
if (instance == null){
synchronized (Singleton2.class){
if (instance == null){
instance = new Singleton2();
}
}
}
return instance;
}
}
3.静态内部类
package jstudy.concur.single;
public class Singleton3 {
private static class Hold{
private static final Singleton3 INSTANCE = new Singleton3();
}
private Singleton3(){}
public static Singleton3 getInstance(){
return Hold.INSTANCE;
}
}
4.枚举
- 枚举类实现单例模式是 effective java 作者极力推荐的单例实现模式,
- 因为枚举类型是线程安全的,并且只会装载一次,设计者充分的利用了枚举的这个特性来实现单例模式,
- 枚举的写法非常简单,而且枚举类型是所用单例实现中唯一一种不会被破坏的单例实现模式。
写法1
package jstudy.concur.single;
public enum Singleton41 {
INSTANCE;
}
写法2
package jstudy.concur.single;
public class Singleton4 {
private Singleton4(){}
private enum Singleton{
INSTANCE;
private final Singleton4 instance;
Singleton(){
instance = new Singleton4();
}
private Singleton4 getInstance(){
return instance;
}
}
public static Singleton4 getInstance(){
return Singleton.INSTANCE.getInstance();
}
}