定义:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例 场景:确保某个类只有一个对象的场景,避免产生多个对象消耗过多资源。如,访问IO、DB等资源时,就要考虑使用单例模式
class Singleton1 {// 饿汉式 private static Singleton1 intance = new Singleton1();//直接初始化 private Singleton1() {} public static Singleton1 getInstance() { return intance; } } class Singleton2 {// 懒汉式 private static Singleton2 intance; private Singleton2() {} public static Singleton2 getInstance() {//用到的时候 才加载 if (intance == null) { intance = new Singleton2(); }return intance; } } class Singleton3 {// 懒汉式 线程安全 private static Singleton3 intance; private Singleton3() {} public synchronized static Singleton3 getInstance() {//用到的时候 才加载, 加锁 多线程调用,都有一个加锁的动作 if (intance == null) { intance = new Singleton3(); } return intance; } } class Singleton4 {// 懒汉式 线程安全 private static Singleton4 intance; private Singleton4() {} public static Singleton4 getInstance() {//用到的时候 才加载 synchronized (Singleton4.class) {// 加锁 if (intance == null) { intance = new Singleton4(); } } return intance; } } public class Singleton {//双重检查 懒汉式 线程安全 private static Singleton intance; private Singleton() {} public static Singleton getInstance() { if (intance == null) {//检查1:如果为null,再执行到下一步加锁;不为null不执行加锁操作 synchronized (Singleton.class) {//类级锁 if (intance == null) {//检查2:为null,才new一个实例 intance = new Singleton(); } } } return intance; } }
靜態內部類別單例模式: 延遲加載,線程安全
public class StaticInnerClassSingleton implements Serializable { private StaticInnerClassSingleton() { } public static StaticInnerClassSingleton getInstance() { return Builder.instance; } private static class Builder { private static StaticInnerClassSingleton instance = new StaticInnerClassSingleton(); } private Object readResolve() throws ObjectStreamException { return Builder.instance; } }
關於函數:readResolve(), 反序列化時的鉤子函數,它是私有的,重寫防止在反序列化時產生新的實例
#以上所有單例方式都有這個問題,嚴格來說都需要重寫
#列舉:可以有屬性和方法,一個元素的列舉即是單例模式,預設執行緒安全性
#
public enum SingletonEnum { INSTANCE_A; private SingletonEnum() {//构造方法只能是private的,不写也是 id = idGenerate++; } public String aa; public String getAa() { return aa; } private int idGenerate = 1000; private final int id; public int getId() { return id; } }
以上是java 單例模式的簡單實現的詳細內容。更多資訊請關注PHP中文網其他相關文章!