1. シングルトン パターン
Java で最も一般的に使用される設計パターンの 1 つであり、そのコア構造にはシングルトンと呼ばれる特別なクラスのみが含まれます。シングルトン パターンを使用すると、システム内にこのパターンを適用するクラスのインスタンスが 1 つだけ存在することが保証されます。
2. パターンの要件
1. 独自の構築メソッドはプライベートである必要があります
2. インスタンスを取得するために他のオブジェクトにパブリックな静的メソッドを提供します
実装メソッド
ハングリーチャイニーズスタイル
public class Simple { private static Simple simple = new Simple(); private Simple() { } public static Simple getInstance() { return simple; } }
この実装メソッドは、クラスがロードされるときにインスタンス化され、遅延ロードがなく、スレッドセーフです。
怠け者スタイル
public class Slacker { private static volatile Slacker slacker = null; private Slacker() { } /** * 最简单的懒汉式实现 * @return */ public static Slacker getInstance() { if(slacker == null) { slacker = new Slacker(); } return slacker; } }
この実装は最も基本的な実装です。最大の問題は、同時アクセス方式が複数のインスタンスを取得するため、厳密に言えばシングルトン モードではないことです。
public class Slacker { //volatile关键字的作用 //1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。 //2、防止指令重排序--通过内存屏障实现 private static volatile Slacker slacker = null; private Slacker() { } /** * 加synchronized关键字解决线程同步问题 * @return */ public static synchronized Slacker getInstanceSync() { if(slacker == null) { slacker = new Slacker(); } return slacker; } }
同期ロックをメソッドに追加するこの方法は、スレッドによる同時アクセスの問題を解決し、シングルトンを実装できますが、ロックの追加は効率に影響を与えるため、この方法では使用されないことがよくあります。
ダブルチェックロック
public class Slacker { //volatile关键字的作用 //1、保证内存可见性:保证每个线程访问volatile修饰的共享变量时获取到的都是最新的。 //2、防止指令重排序--通过内存屏障实现 private static volatile Slacker slacker = null; private Slacker() { } /** * 双重检查锁解决线程同步问题 * @return */ public static Slacker getInstanceDoubleLock() { if(slacker == null) { synchronized (Slacker.class) { if(slacker == null) { slacker = new Slacker(); } } } return slacker; } }
このメソッドは、マルチスレッドの同時アクセスに適応し、高いパフォーマンスを維持できるダブルロックメカニズムを使用します。
静的内部クラス実装
/** * 静态内部类方式实现单例模式 * * 当StaticInnerClass第一次被加载时,并不需要去加载StaticInnerClassHoler,只有当getInstance()方法第一次被调用时, * 才会去初始化staticInnerClass,第一次调用getInstance()方法会导致虚拟机加载StaticInnerClassHoler类,这种方法不仅能 * 确保线程安全,也能保证单例的唯一性,同时也延迟了单例的实例化。 * * @author chenf * */ public class StaticInnerClass { private StaticInnerClass() { } // 静态内部类 private static class StaticInnerClassHoler { // 在静态内部类中定义外部类的实例 private static StaticInnerClass staticInnerClass = new StaticInnerClass(); } /** * 获取时调用静态内部类的类属性获取外部类的实例 * * @return */ public static StaticInnerClass getInstance() { return StaticInnerClassHoler.staticInnerClass; } }
このメソッドは、マルチスレッドの安全なアクセスを実現できるだけでなく、内部クラス読み込みメカニズムを使用して遅延読み込みを実現することもできます。
以上がJava のいくつかの一般的な設計パターンに関する簡単な説明: シングルトン パターンの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。