單例模式的7種寫法
阿新 • • 發佈:2018-11-20
文章目錄
1. 懶漢模式,單例例項在第一次使用時進行建立,非執行緒安全
/**
* @program: Singleton
* @description: 懶漢模式,單例例項在第一次使用時進行建立,<b>非執行緒安全</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:15
**/
public class SingletonDemo1 {
//私有構造方法
private SingletonDemo1() {
}
//單例物件
private static SingletonDemo1 instance = null;
//靜態工廠方法
public static SingletonDemo1 getInstance() {
if (instance == null) {
instance = new SingletonDemo1();
}
return instance;
}
}
2. 餓漢模式,單例例項在類裝載時進行建立,執行緒安全
/**
* @program: Singleton
* @description: 餓漢模式,單例例項在類裝載時進行建立,<b>執行緒安全</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:21
**/
public class SingletonDemo2 {
//私有構造方法
private SingletonDemo2() {
}
//單例物件
private static SingletonDemo2 instance = new SingletonDemo2();
//靜態的工廠方法
public static SingletonDemo2 getInstance() {
return instance;
}
}
3. 懶漢模式,單例例項在第一次使用時進行建立,執行緒安全,不推薦使用
/**
* @program: Singleton
* @description: 懶漢模式,單例例項在第一次使用時進行建立,<b>執行緒安全,不推薦使用</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:29
**/
public class SingletonDemo3 {
//私有構造方法
private SingletonDemo3() {
}
//單例物件
private static SingletonDemo3 instance = null;
//靜態工廠方法
public static synchronized SingletonDemo3 getInstance() {
if (instance == null) {
instance = new SingletonDemo3();
}
return instance;
}
}
4. 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,非執行緒安全
/**
* @program: Singleton
* @description: 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,<b>非執行緒安全</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:38
**/
public class SingletonDemo4 {
//私有構造方法
private SingletonDemo4() {
}
//單例物件
private static SingletonDemo4 instance = null;
//靜態工廠方法
public static SingletonDemo4 getInstance() {
//雙重檢測機制
if (instance == null) {
//同步鎖
synchronized (SingletonDemo4.class) {
if (instance == null) {
instance = new SingletonDemo4();
}
}
}
return instance;
}
}
5. 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,執行緒安全
/**
* @program: Singleton
* @description: 懶漢模式,雙重同步鎖單例模式,單例例項在第一次使用時建立,<b>執行緒安全</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:45
**/
public class SingletonDemo5 {
//私有構造方法
private SingletonDemo5() {
}
//單例物件 volatile + 雙重檢測機制 -> 禁止指令重排
private volatile static SingletonDemo5 instance = null;
//靜態工廠方法
public static SingletonDemo5 getInstance() {
//雙重檢測機制
if (instance == null) {
//同步鎖
synchronized (SingletonDemo5.class) {
if (instance == null) {
instance = new SingletonDemo5();
}
}
}
return instance;
}
}
6. 餓漢模式,單例例項在類裝載時進行建立,執行緒安全
/**
* @program: my-blog
* @description: 餓漢模式,單例例項在類裝載時進行建立,<b>執行緒安全</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:56
**/
public class SingletonDemo6 {
//私有構造方法
private SingletonDemo6() {
}
//單例物件
private static SingletonDemo6 instance = null;
static {
instance = new SingletonDemo6();
}
//靜態工廠方法
public static SingletonDemo6 getInstance() {
return instance;
}
}
7. 列舉模式,執行緒安全,推薦使用
/**
* @program: Singleton
* @description: 列舉模式,<b>執行緒安全,推薦使用</b>
* @author: Mr.superbeyone
* @create: 2018-09-30 09:59
**/
public class SingletonDemo7 {
//私有構造方法
private SingletonDemo7() {
}
public static SingletonDemo7 getInstance() {
return Singleton.INSTANCE.getInstance();
}
private enum Singleton {
INSTANCE;
private SingletonDemo7 singleton;
//JVM保證這個方法絕對只調用一次
Singleton() {
singleton = new SingletonDemo7();
}
private SingletonDemo7 getInstance() {
return singleton;
}
}
}