定义:确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例 场景:确保某个类只有一个对象的场景,避免产生多个对象消耗过多资源。如,访问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 中国語 Web サイトの他の関連記事を参照してください。