java实现单例模式线程安全
生活随笔
收集整理的這篇文章主要介紹了
java实现单例模式线程安全
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、餓漢模式
//餓漢模式:(線程安全) public class Singleton {// 靜態(tài)私有成員變量private static Singleton instance = new Singleton();// 私有構(gòu)造函數(shù)private Singleton() {}// 靜態(tài)方法,返回唯一實(shí)例public static Singleton getInstance() {return instance;} }優(yōu)點(diǎn):線程安全,效率比懶漢快
缺點(diǎn):它不管是是否被調(diào)用都會提前創(chuàng)建類的實(shí)例,所以資源利用率比較低,系統(tǒng)加載時間比較長。
2、懶漢模式
// 懶漢模式:(線程不安全,需要通過雙重檢查鎖定機(jī)制控制)(雙檢鎖) public class Singleton {// 靜態(tài)私有成員變量private static Singleton instance = null;// 私有構(gòu)造函數(shù)private Singleton() {}// 靜態(tài)公有工廠方法,判斷成員變量是否為空,不為空則實(shí)例化public static Singleton getInstance() {if(instance == null)instance = new Singleton();return instance;} }優(yōu)點(diǎn):實(shí)現(xiàn)了延遲加載
缺點(diǎn):線程不安全,需要克服多線程同時訪問的問題,需要通過雙檢鎖(雙重檢查鎖定機(jī)制)來進(jìn)行控制,導(dǎo)致性能受到一定影響。
3、雙檢鎖模式
public class Singleton {// 私有靜態(tài)成員變量private static volatile Singleton instance = null;// 私有構(gòu)造函數(shù)private Singleton() {}// 共有靜態(tài)工廠方法public static Singleton getInstance() {// 判斷 instance 是否為空,// 為空->加鎖,創(chuàng)建實(shí)例(為了進(jìn)程安全,再次判斷)// 不為空->返回實(shí)例if(instance == null) {synchronized (Singleton.class) {if(instance == null)instance = new Singleton();}}return instance;} }優(yōu)點(diǎn):線程安全
缺點(diǎn):因?yàn)榧渔i了,性能受到影響
靜態(tài)內(nèi)部類
public class Singleton{//私有構(gòu)造函數(shù)private Singleton(){}//靜態(tài)內(nèi)部類private static class HolderClass{private static final Singleton instance = new Singleton();}//靜態(tài)公有工廠方法,返回內(nèi)部類中創(chuàng)建的實(shí)現(xiàn)public static singleton getInstance(){return HolderClass.instance;} }原理:加載Singleton類的過程中,會為類變量在方法區(qū)中分配內(nèi)存空間并初始化,但是,并不會加載靜態(tài)內(nèi)部類HolderClass.
當(dāng)調(diào)用Singleton.getInstance(),執(zhí)行return HolderClass.instance語句時,HolderClass類才會被加載,instance對象才會被初始化。
枚舉
public enum Singleton {INSTANCE;public void doSomething() {System.out.println("doSomething");} } public class Main {public static void main(String[] args) {Singleton.INSTANCE.doSomething();} }總結(jié)
以上是生活随笔為你收集整理的java实现单例模式线程安全的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C++ Websites
- 下一篇: HDR 成像技术学习(二)