Java のいくつかの一般的な設計パターンに関する簡単な説明: シングルトン パターン

无忌哥哥
リリース: 2018-07-23 11:25:10
オリジナル
1674 人が閲覧しました

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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!