单例模式的懒汉式如何测试线程是否安全

/**

  • 线程安全的懒汉式
    */
    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.为什么里外层都做是否有实例的判断,是因为如果是两个或多个线程,它们都会进入第一个判断,此时因为锁,
    // 第一个线程进去做下一步判断并创建了实例,而第二线程在等待第一个线程结束之后也会接着执行,此时如果没有
    // 非空判断,它就会又实例一个对象,就不是单例了
    public static SingletonThread getInstance1(){
    if (instance == null) {
    synchronized (SingletonThread.class){
    if (instance == null) {
    instance = new SingletonThread();
    }
    }
    }
    return instance;
    }

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) {
Thread1 t1 = new Thread1();
Thread1 t2 = new Thread1();
Thread1 t3 = new Thread1();

    t1.start();
    t2.start();
    t3.start();
}

}
//调用第getInstance()方法时,线程调用多次可能会出现创建不同的实例,调用getInstance1()时,实例都相同

你可能感兴趣的:(java知识,java,设计模式)