3つのスレッドセキュリティの単一モード

4429 ワード

1、概念:
Singleton(Singleton):システムに1つのクラスが1つのインスタンスしかないことを保証し、グローバル・アクセス・ポイントを提供することを目的とする単一状態モードとも呼ばれます.すなわち、システム内の1つのクラスに1つのインスタンスしかなく、外部からのアクセスが容易であることを保証し、インスタンスの個数の制御を容易にし、システムリソースを節約するために発生するソリューションである.
2、シーンを適用する:
2.1、頻繁にインスタンス化して破棄する場合、すなわち頻繁なnewオブジェクトは、単例モードを考慮することができる.
2.2、オブジェクトの作成に時間がかかりすぎたり、リソースがかかりすぎたりするが、よく使われるオブジェクト.
2.3、頻繁にIO資源にアクセスするオブジェクト、例えばデータベース接続プール或いはローカルファイルにアクセスする;
3、スレッド安全の一例モード
3.1静的内部クラスモード:
public class Singleton{

    //      
    private Singleton(){

    }
    
    //      
    private static class Innerclass{
        private static final Singleton SINGLETON = new Singleton();
    }

    public Singleton getInstance(){
        return Innerclass.SINGLETON
    }
}

3.2二重検査ロック:
public class Singleton{
    //        
    private static volatile Singleton instance = null;
    //      
    private Singleton(){}

    public Singleton getInstance(){
        if(instance == null){
            synchronized(Singleton.class){
                if(instance == null){
                    instance = new Singleton();
                }
            }
        }
        return instance ;
    } 
}

4、5種類の一例
package org.sw.single;

/**
 *     
 * 
 * @Description: TODO
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */

/**
 *    
 * 
 * @Description: TODO
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
public class Singleton {

	private static Singleton instance = new Singleton();

	private Singleton() {
	}

	public static Singleton getInstance() {
		return instance;
	}

}

/**
 *    
 * 
 * @Description: TODO
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
class LazySingleton {

	private static LazySingleton lazySingleton;

	private LazySingleton() {
	}

	private static LazySingleton getInstance() {

		if (null == lazySingleton) {
			lazySingleton = new LazySingleton();
		}
		return lazySingleton;
	}
}

/**
 *               
 * 
 * @Description: 1        — synchronized  
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
class MultiThreadSingleton {

	private static MultiThreadSingleton instance;

	private MultiThreadSingleton() {
	}

	public static synchronized MultiThreadSingleton getInstance() {
		if (null == instance) {
			instance = new MultiThreadSingleton();
		}
		return instance;
	}
}

/**
 *               
 * 
 * @Description: 2        — synchronized 
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
class BlockSingle {

	private static BlockSingle instance;

	private BlockSingle() {

	}

	private static BlockSingle getInstance() {
		//    synchronized  ,           
		synchronized (BlockSingle.class) {
			if (null == instance) {
				instance = new BlockSingle();
			}
		}
		return instance;
	}

}

/**
 *               
 * 
 * @Description: 3        —            
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
class InterClassSingleton {

	private InterClassSingleton() {
	}

	private static class InterClass {
		private static InterClassSingleton instance = new InterClassSingleton();
	}

	private static InterClassSingleton getInstance() {
		return InterClass.instance;
	}
}

/**
 *               
 * 
 * @Description: 4     (          )
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
class DoubleCheckSingleton {

	private static DoubleCheckSingleton instance;

	private DoubleCheckSingleton() {
	}

	private static DoubleCheckSingleton getInstance() {
		// Double.Check idiom
		if (null == instance) {
			synchronized (DoubleCheckSingleton.class) {
				if (null == instance) {
					instance = new DoubleCheckSingleton();
				}
			}
		}
		return instance;
	}
}

/**
 *               
 * 
 * @Description: 5 ThreadLocal
 * @author liangsw
 * @date 2019-07-22
 * @version 1.0v
 */
class ThreadLocalSingleton {

	// ThreadLocal       ,   instance     
	private static ThreadLocal threadLocal = new ThreadLocal();

	private static ThreadLocalSingleton instance;

	private ThreadLocalSingleton() {
	}

	private static ThreadLocalSingleton getInstance() {
		if (threadLocal.get() == null) {
			synchronized (ThreadLocalSingleton.class) {
				if (instance == null) {
					instance = new ThreadLocalSingleton();
				}
			}
			threadLocal.set(instance);
		}
		return threadLocal.get();
	}
}