Java设计模式:单例模式
學而時習,穩固而之心,
好久沒有復習java的知識了,今天有空溫習了單例模式,這里記錄一下
?
單例模式是常見的設計模式的一種,其特點就是 指一個類只有一個實例,且該類能自行創建這個實例? ,?
保證一個類僅有一個實例,并提供一個訪問它的全局訪問點?
看到全局我想到了staic ,昨天晚上聽課學習,老師問這個是什么模式,有同學說是單例模式,都沒看到static 居然說單例,想想都可怕,我也是趕緊今天補充補充
下面看看單例的幾種寫法
第一種?餓漢模式
//餓漢模式
public class Singletion {//創建一個靜態的類并實例化private static Singletion instance = new Singletion();// 私有構造方法private Singletion() {}//獲取唯一可用的對象public static Singletion getInstance() {return instance;}public void Method(){System.out.println("單例模式學習");}}
調用
public class Main {public static void main(String[] args) {//獲取唯一可用的對象Singletion singletion = Singletion.getInstance();//顯示singletion.Method();}}
優點:餓漢模式天生是線程安全的,使用時沒有延遲。
?缺點:啟動時即創建實例,啟動慢,有可能造成資源浪費
第二種寫法:
懶漢模式(通常也叫飽漢模式)
// 懶漢模式(飽漢模式)
public class Singletion {//創建一個靜態的類private static Singletion singleton = null;// 私有構造方法private Singletion() {}//獲取唯一可用的對象public static Singletion getInstance() {if (singleton==null){singleton = new Singletion();}return singleton;}public void Method(){System.out.println("單例模式學習");}}
方法調用
public class Main {public static void main(String[] args) {//獲取唯一可用的對象Singletion singletion = Singletion.getInstance();//顯示singletion.Method();}}
優點:懶加載啟動快,資源占用小,使用時才實例化,無鎖。
缺點:非線程安全。
第三種寫法,懶漢添加鎖
懶漢模式(飽漢模式) --線程安全?
// 懶漢模式(飽漢模式) )--線程安全
public class Singletion {//創建一個靜態的類private static Singletion singleton = null;// 私有構造方法private Singletion() {}//獲取唯一可用的對象public static synchronized Singletion getInstance() {if (singleton==null){singleton = new Singletion();}return singleton;}public void Method(){System.out.println("單例模式學習");}}
懶加載啟動快,資源占用小,使用時才實例化,添加了鎖
缺點:synchronized 為獨占排他鎖,并發性能差。即使在創建成功以后,獲取實例仍然是串行化操作。
?
第四種寫法:
懶漢模式(飽漢模式) )--雙重加鎖檢查DCL(Double Check Lock)
// 懶漢模式(飽漢模式) )--雙重加鎖檢查DCL(Double Check Lock)
public class Singletion {//創建一個靜態的類private volatile static Singletion singleton = null;// 私有構造方法private Singletion() {}//獲取唯一可用的對象public static Singletion getInstance() {if (singleton==null){//同步塊,線程安全的創建實例synchronized (Singletion.class){//再次檢查實例是否存在,如果不存在才真的創建實例if (singleton ==null){singleton=new Singletion();}}}return singleton;}public void Method(){System.out.println("單例模式學習");}}
優點:懶加載,線程安全。
?注:實例必須有?volatile 關鍵字修飾,其保證初始化完全。
?
第五種寫法
Holder模式
// Holder模式
public class Singletion {/*** 類級的內部類,也就是靜態的成員式內部類,該內部類的實例與外部類的實例* 沒有綁定關系,而且只有被調用到才會裝載,從而實現了延遲加載*/private static class SingletionHolder {/*** 靜態初始化器,由JVM來保證線程安全*/private static Singletion instance = new Singletion();}/*** 私有化構造方法*/private Singletion() {}public static Singletion getInstance() {return SingletionHolder.instance;}public void Method() {System.out.println("單例模式學習");}}
?優點:將懶加載和線程安全完美結合的一種方式(無鎖)
?
參考連接
https://www.runoob.com/design-pattern/singleton-pattern.html
https://www.cnblogs.com/t0000/p/8250686.html
?
?
?
總結
以上是生活随笔為你收集整理的Java设计模式:单例模式的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求一个放下的个性签名!
- 下一篇: android Service 的使用