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