实现方法一:
饿汉式
public static class Singleton{
private static Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
实现方法二:
懒汉式
public static class Singleton{
private static Singleton instance;
private Singleton(){};
public static synchronized Singleton getInstance(){
if(instance == null){
instance = new Singleton();
}
return instance;
}
}
实现方法三
双重检验加锁
public static class Singleton{
private static volatile Singleton instance;
private Singleton(){}
public static Singleton getInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块
if(instance == null){
//同步块,线程安全的创建实例
synchronized (Singleton.class){
//再次检查实例是否存在,如果不存在才真正的创建实例
if(instance == null){
instance = new Singleton();
}
}
}
return instance;
}
}
实现方法四
静态内部类
public static class Singleton{
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
实现方法五
public static class Singleton{
private static class SingletonHolder{
private static final Singleton instance = new Singleton();
}
private Singleton(){}
public static Singleton getInstance(){
return SingletonHolder.instance;
}
}
实现方法六
枚举式,实现单例最推荐使用的实现方式
优点:1.线程安全 2.不会因为序列化而产生新实例 3.防止反射攻击
public enum Singleton {
INSTANCE;
private Singleton(){}
public Singleton getInstance(){
return INSTANCE;
}
}
也可以修改一下构造方法,测试一下
public enum EmuTest {
private final int age;
private final String name;
INSTANCE("fonxian",22);
//INSTANCE就相当于private static EmuTset instance = new EmuTest();
private EmuTest(String name,int age){
this.name = name;
this.age = age;
}
public EmuTest getInstance(){
return INSTANCE;
}
}
测试
public class SingletonTest {
public static void main(String[] args) {
EmuTest et1 = EmuTest.INSTANCE.getInstance();
EmuTest et2 = EmuTest.INSTANCE.getInstance();
//返回的结果是true
System.out.println(et1==et2);
}
}