单例模式的各种写法

xiaoxiao2021-02-28  48

1、线程不安全的

public class Singleton { private static Singleton instance; private Singleton(){} public static Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } } 2、线程安全,但是性能不是太高 public class Singleton { private static Singleton instance; private Singleton(){} public static synchronized Singleton getInstance(){ if (instance == null){ instance = new Singleton(); } return instance; } } public class Singleton { private Singleton() {} //私有构造函数 private volatile static Singleton instance = null; //单例对象 //静态工厂方法 public static Singleton getInstance() { if (instance == null) { //双重检测机制 synchronized (Singleton.class){ //同步锁 if (instance == null) { //双重检测机制 instance = new Singleton(); } } } return instance; } } 3、匿名内部类形式 public class Singleton { private Singleton(){} private static class LazyHolder{ private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance(){ return LazyHolder.INSTANCE; } } 4、线程安全,性能较高 public class Singleton { private static Singleton instance; private static byte[] lock = new byte[0]; private Singleton(){} public static Singleton getInstance(){ if (instance == null){ synchronized (lock){ if (instance == null){ instance = new Singleton(); } } } return instance; } } public class Singleton { private static Singleton instance; private static ReentrantLock lock = new ReentrantLock(); private Singleton(){} public static Singleton getInstance(){ if (instance == null){ lock.lock(); if (instance == null){ instance = new Singleton(); } lock.unlock(); } return instance; } } 5、枚举实现方式 public class Singleton { private Singleton(){} public static Singleton getInstance(){ return SingletonEnum.INSTANCE.getInstance(); } private static enum SingletonEnum { INSTANCE; private Singleton singleton; private SingletonEnum(){ singleton = new Singleton(); } public Singleton getInstance() { return singleton; } } } 注:摘自《Java并发编程从入门到精通》
转载请注明原文地址: https://www.6miu.com/read-2150072.html

最新回复(0)