シングルトン
これは、デザインパターンです。いわゆるシングルモードの実施形態では、全体のシステムは、オブジェクトがこれだけであり、重複オブジェクトの生成がないことです。
1.怠惰なスタイル
名前が示すように、あなたがオブジェクトを作成するために、私のサイトを使用する場合、それは、怠惰です。
// 单例对象
class SingleObject{
private static SingleObject instance;
//构造方法私有化
private SingleObject(){
System.out.println("我是 SingleObject 的构造方法");
}
public static SingleObject getInstance() {
if(instance==null) {
instance = new SingleObject();
return instance;
}
return instance;
}
}
2.飢え式
名前が示すように、それはあなたが使用するのを待っている、あなたを作成するには良いターゲットを設置、警戒することです。
// 单例对象
class SingleObject{
private static SingleObject instance = new SingleObject();;
//构造方法私有化
private SingleObject(){
System.out.println("我是 SingleObject 的构造方法");
}
public static SingleObject getInstance() {
return instance;
}
}
注:シングルスレッドでと怠惰な男のスタイルは、問題を解決することができますが、マルチスレッド環境では、非常に多くの問題がある飢え!
テストへの明確な、私たちのオンサイトを見て:
// 单例对象
class SingleObject{
private static SingleObject instance;
//构造方法私有化
private SingleObject(){
System.out.println( Thread.currentThread().getName() + " 我是 SingleObject 的构造方法");
}
public static SingleObject getInstance() {
if(instance == null) {
instance = new SingleObject();
return instance;
}
return instance;
}
}
// 单例模式:饿汉式多线程测试
public class SingleDemo {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
new Thread(()->{
SingleObject.getInstance();
},i+"").start();
}
}
}
結果:
新しいモデルを作成し、マルチスレッド環境の組み合わせは、だから、
3.(DCL)は被写体ロックビス
// 单例对象
class SingleObject{
private static SingleObject instance;
//构造方法私有化
private SingleObject(){
System.out.println( Thread.currentThread().getName() + " 我是 SingleObject 的构造方法");
}
public static SingleObject getInstance() {
if(instance == null) {
synchronized (SingleObject.class) {
if(instance == null) {
instance = new SingleObject();
return instance;
}
}
}
return instance;
}
}
また、ダブルチェックロックとして知られているダブルチェックロック(DCL)は、統合から怠惰な男と飢えスタイルの両方の長所と短所を統合しました。しかし、このメカニズムは必ずしもスレッドセーフではありません、それは持っているので理由は、コマンドの並べ替え、そのため、必要に命令の並べ替えを禁止する揮発性を追加するために存在します。あなたは、命令の並べ替えを理解していない場合は、ブログを見ることができます:volatileキーワードを
いないのであれば、マルチスレッドでのセマンティック一貫性を確保するために、並べ替えの指示を禁止する必要が、スレッド不安のいくつかの可能性があります。
4.揮発バージョンDCL(完璧)
// 单例对象(双检锁+volatile)推荐使用
class SingleObject{
// 加上 volatile 关键字,禁止指令重排
private static volatile SingleObject instance;
//构造方法私有化
private SingleObject(){
System.out.println( Thread.currentThread().getName() + " 我是 SingleObject 的构造方法");
}
public static SingleObject getInstance() {
if(instance == null) {
synchronized (SingleObject.class) {
if(instance == null) {
instance = new SingleObject();
return instance;
}
}
}
return instance;
}
}