一.餓漢模式
/**
* 餓漢式,
* 類加載到內(nèi)存后,就實例化一個單例,JVM保證線程安全,
* 簡單使用
* 缺點:無論是否使用,類裝載時就實例化
* Class.forName("")
* */
public class SingleDesign {
public final static SingleDesign instance = new SingleDesign();
private SingleDesign(){}
public static SingleDesign getSingleInstance(){
return instance;
}
public static void main(String[] args){
}
}
二.懶漢模式
/**
* 懶漢式
* 線程不安全
* 可以通過加synchronized來保證線程安全,不過會導(dǎo)致性能下降
* */
public class SingleDesign2 {
private static volatile SingleDesign2 instance = null;
private SingleDesign2(){}
public static synchronized SingleDesign2 getSingleInstance(){
if (instance == null){
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
instance = new SingleDesign2();
}
return instance;
}
public static void main(String[] args){
//System.out.println(SingleDesign2.getSingleInstance() == SingleDesign2.getSingleInstance());
for (int i=0;i<100;i++){
new Thread(()->{
System.out.println(SingleDesign2.getSingleInstance().hashCode());
}).start();
}
}
}
三.雙重條件下的懶漢模式
/**
* 懶漢式地進一步優(yōu)化
* 雙重檢查
* 線程安全
**/
public class SingleDesign3 {
private static volatile SingleDesign3 instance = null;
private SingleDesign3(){}
public static SingleDesign3 getSingleInstance(){
if (instance == null){
//雙重檢查
synchronized (SingleDesign3.class){
if (instance == null){
instance = new SingleDesign3();
}
}
}
return instance;
}
public static void main(String[] args){
for (int i=0;i<100;i++){
new Thread(()->{
System.out.println(SingleDesign3.getSingleInstance().hashCode());
}).start();
}
}
}
四.內(nèi)部類實現(xiàn)方式
/**
* 使用內(nèi)部類的方式實現(xiàn),線程安全,更加完美的方式
*
* */
public class SingleDesign4 {
private SingleDesign4(){}
public static SingleDesign4 getSingleInstance(){
return InnerSingleDesign4.instance;
}
//內(nèi)部類
private static class InnerSingleDesign4{
private static final SingleDesign4 instance = new SingleDesign4();
}
public static void main(String[] args){
for (int i=0;i<100;i++){
new Thread(()->{
System.out.println(SingleDesign4.getSingleInstance().hashCode());
}).start();
}
}
}
五.枚舉實現(xiàn)方式
/**
* 不僅可以解決線程同步,還可以防止反序列化(枚舉沒有構(gòu)造方法),最完美的方式
*
*
* */
public enum SingleDesign5 {
INSTANCE;
public static void main(String[] args){
for (int i=0;i<100;i++){
new Thread(()->{
try {
Thread.sleep(10);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(SingleDesign5.INSTANCE.hashCode());
}).start();
}
}
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。