単一のパターンの怠け者はスレッドが安全かどうかをテストする方法
/** スレッド安全な怠け者*/public class SingletonThread{private static SingletonThread instance;private SingletonThread(){}//1.マルチスレッドの場合にロックをかけ、複数のスレッドが同時にアクセスできるようにすると、複数のインスタンスが作成されない//2.しかし、このコードの問題はgetInstanceメソッドを呼び出すたびにロックされ、パフォーマンスが無駄になるpublic static SingletonThread getInstance(){synchronized(SingletonThread.class){if(instance==null){instance=new SingletonThread();} return instance; } }//3.だから外層でもう一度インスタンスがあるかどうかを判断し、スレッドを入れなかった//4.なぜ内層でインスタンスがあるかどうかを判断するのかは、2つ以上のスレッドであれば、いずれも1つ目の判断に入るため、ロック//1つ目のスレッドが入って次の判断をしてインスタンスを作成し、2つ目のスレッドは1つ目のスレッドが終わるのを待ってからも次に、//非空判定がない場合は、public static SingletonThread getInstance 1(){if(instance==null){synchronized(SingletonThread.class){if(instance=new SingletonThread()}}return instance;} が実行されます.
class Thread1 extends Thread{
}//テストpublic static void main(String[]args){Thread 1 t 1=new Thread 1();Thread 1 t 2=new Thread 1();Thread 1 t 3=new Thread 1();
}//getInstance()メソッドを呼び出すと、スレッド呼び出しが複数回発生して異なるインスタンスが作成される可能性があります.getInstance 1()を呼び出すと、インスタンスは同じです.
class Thread1 extends Thread{
@Override
public void run() {
SingletonThread s1 = SingletonThread.getInstance1();
System.out.println(this.getName()+"------------>"+s1.hashCode());
}
}//テストpublic static void main(String[]args){Thread 1 t 1=new Thread 1();Thread 1 t 2=new Thread 1();Thread 1 t 3=new Thread 1();
t1.start();
t2.start();
t3.start();
}
}//getInstance()メソッドを呼び出すと、スレッド呼び出しが複数回発生して異なるインスタンスが作成される可能性があります.getInstance 1()を呼び出すと、インスタンスは同じです.