两种线程安全的单例模式

静态内部类 单例模式

package 单例模式.InnerClass;

/*
 *  静态内部类  单例模式
 */
public class Singleton {
    private Singleton(){}
    private static final class SingletonHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
    
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(Singleton.getInstance().hashCode());
            }
            
        },"t1");
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(Singleton.getInstance().hashCode());
            }
            
        },"t2");
        
        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(Singleton.getInstance().hashCode());
            }
            
        },"t3");
        
        t1.start();
        t2.start();
        t3.start();
    }
    
}

双重校验 单例模式

package 单例模式.DoubleCheck;
/*
 * 双重校验  单例模式
 */
public class Singleton {
    private volatile static Singleton instance;
    private Singleton() {}
    public static Singleton getInstance() {
        if(instance==null) {
            synchronized(Singleton.class) {
                if(instance==null) {
                    instance = new Singleton();
                }
                //instance = new Singleton();
            }
        }
        return instance;
    }
    
    public static void main(String[] args) {
        Thread t1 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(Singleton.getInstance().hashCode());
            }
            
        },"t1");
        
        Thread t2 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(Singleton.getInstance().hashCode());
            }
            
        },"t2");
        
        Thread t3 = new Thread(new Runnable() {

            @Override
            public void run() {
                System.out.println(Singleton.getInstance().hashCode());
            }
            
        },"t3");
        
        t1.start();
        t2.start();
        t3.start();
    }
}

猜你喜欢

转载自www.cnblogs.com/hglibin/p/9397974.html