/**
* 1. 懒汉(延迟加载)
* 2. 正确
* 3. 效率还比较高
* 通过
* 1. volatile 的引入,目的解决 ins = new ...(); 重排序带来的问题
* 2. synchronized 的引入,目的是解决原子性问题
* 3. 见方法注释
*/
public class LazySingleton3 {
//直属类的对象
private static volatile LazySingleton3 ins = null;
//构造方法
private LazySingleton3() {}
//一个获得 ins 的方法
public static LazySingleton3 getInstance3() {
if (ins == null) {
synchronized (LazySingleton3.class) {
if (ins == null) {
ins = new LazySingleton3();
}
}
}
return ins;
}
//建立一个线程的类
static class MyThread extends Thread {
@Override
public void run() {
LazySingleton3 ins1 = LazySingleton3.getInstance3();
System.out.println(ins1);
}
}
//将这个程序以多线程运行
public static void main(String[] args) {
MyThread[] threads = new MyThread[20];
for (int i = 0; i < 20; i++) {
threads[i] = new MyThread();
}
for (int i = 0; i < 20; i++) {
threads[i].start();
}
/*
单例模式之懒汉1 ins1 = 单例模式之懒汉1.getInstance();
单例模式之懒汉1 ins2 = 单例模式之懒汉1.getInstance();
单例模式之懒汉1 ins3 = 单例模式之懒汉1.getInstance();
System.out.println(ins1 == ins2);
System.out.println(ins2 == ins3);
*/
}
}
レイジーのシングルトンパターン:
シングル例:オブジェクトのみをインスタンス化します。
開始を飢えは異なる初期化して、遅延初期化は、スレッド内のオブジェクトがある場合に、移動の目的は、メモリ空間を節約するためであると呼ばれます。
アトミックの問題が同期していない場合は、複数のオブジェクトが新しい、非準拠の単一の実施形態かもしれ存在することになる保証するものではありません。
(イン== null)の場合は何も外がない場合は、最初の新しいオブジェクトの後、スレッド相互に排他的なロックがまだ奪われますので、全体のコードは、効率が低い原因になります。
何の事前揮発性グローバル変数インが存在しない場合は、次の3つの主要なステップは、オブジェクトの内部でこの問題を並べ替えている(参照の割り当て、オープンスペース、初期に)INS。