日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

单例模式(单一实例)

發布時間:2025/3/20 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 单例模式(单一实例) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

單例模式基本要點:

?

用于確保一個類只有一個實例,并且這個實例易于被訪問。

讓類自身負責保存他的唯一實例。這個類可以保證沒有其他實例創建,并且他可以提供一個訪問實例的方法,來實現單例模式。

(1)把構造方法聲明為 private ,確保只能由自己創建,避免外部創建實例或被子類繼承從而創建額外實例。

(2)定義一個私有靜態的該類的實例作為該類的數據域,確保一個類只有一個實例。

(3)定義一個靜態工廠方法,外部類不能實例化一個該類的對象,所有只能用static的方法,提供給其它類調用返回此單例類的唯一實例。

回收站單例類:

1 import java.security.KeyStore.PrivateKeyEntry; 2 3 public class RecycleBin { 4 private static RecycleBin recycleBin = null; 5 /* 6 * 7 *private 構造方法 保證其他類不能通過 new 創建實例 8 */ 9 private RecycleBin() { 10 System.out.println("回收站被創建!"); 11 } 12 13 public static RecycleBin getrecyclebin() { 14 15 if (recycleBin==null) { 16 recycleBin = new RecycleBin(); 17 }else { 18 System.out.println("系統只能有一個回收站,不能重復!"); 19 } 20 21 return recycleBin; 22 } 23 24 void clearbin(){ 25 System.out.println("回收站被清空!"); 26 } 27 28 }

?

客戶測試類:

1 public class SingletonPattern { 2 3 public static void main(String[] args) { 4 RecycleBin x = RecycleBin.getrecyclebin(); 5 x.clearbin(); 6 RecycleBin y = RecycleBin.getrecyclebin(); 7 x.clearbin(); 8 if(x==y){ 9 System.out.println("x和y是相同的實例"); 10 }else { 11 System.out.println("x和y不是相同的實例"); 12 } 13 } 14 15 }

?但是涉及到多線程仍然無法保證單例。

線程類:

1 public class Mythread extends Thread { 2 @Override 3 public void run() { 4 RecycleBin x = null; 5 x=RecycleBin.getrecyclebin(); 6 System.out.println(x+":"+x.hashCode()); 7 8 } 9 }

客戶測試類:

public class SingletonPattern {public static void main(String[] args) { for(int i = 0;i<10;i++){Mythread mythread = new Mythread();mythread.start(); }}}

測試結果:

com.Singleton.windowRecycleBin.RecycleBin@3c648a9d:1013222045 com.Singleton.windowRecycleBin.RecycleBin@10533d95:273890709 com.Singleton.windowRecycleBin.RecycleBin@3b9cec95:1000139925 com.Singleton.windowRecycleBin.RecycleBin@28a4ac8:42617544 com.Singleton.windowRecycleBin.RecycleBin@4bb40e1:79380705 com.Singleton.windowRecycleBin.RecycleBin@63e13bff:1675705343 com.Singleton.windowRecycleBin.RecycleBin@51ea99e2:1374329314 com.Singleton.windowRecycleBin.RecycleBin@dbfdd93:230677907

解決方法 1:使用synchronized關鍵字

???????????? synchronized 的英文意思是“被同步,已同步了”,該該關鍵字的作用就是為并發線程提供一種同步機制,用于保證在同一時刻最多只有一個線程來執行某段事先定義好要求同步訪問的代碼。因此,我們可以將一個方法標記為synchronized,迫使線程在執行這個方法前,要等待其他線程離開這個方法,這樣就不會有兩個線程同時操作該方法了。

?????????????? 于是修改單例類,在getrecyclebin()方法之前加上synchronized關鍵字,其它代碼不變。

??????????????? 加上synchronized關鍵字之后,線程得到的是一個實例,但是這里又引出一個問題·:效率。每次調用getrecyclebin()的時候都要進行同步,會造成負擔。

解決方法 2:雙重檢查加鎖(不適用于1.4及以前版本的java)

?????????????????? 利用雙重檢查加鎖,首先檢查是否已實現了實例? ,如果還沒創建才進行同步,這樣只會有第一次同步,效率自然會提高。

??? 單例類: ???????????????

1 import java.security.KeyStore.PrivateKeyEntry; 2 3 public class RecycleBin { 4 private static RecycleBin recycleBin = null; 5 /* 6 * 7 *private 構造方法 保證其他類不能通過 new 創建實例 8 */ 9 private RecycleBin() { 10 System.out.println("回收站被創建!"); 11 } 12 13 public static RecycleBin getrecyclebin() { 14 15 synchronized (RecycleBin.class) { 16 if (recycleBin==null) { 17 recycleBin = new RecycleBin(); 18 }else { 19 System.out.println("系統只能有一個回收站,不能重復!"); 20 } 21 22 return recycleBin; 23 } 24 25 } 26 27 void clearbin(){ 28 System.out.println("回收站被清空!"); 29 } 30 31 } synchronized只加在能判斷或函數外,如果加在 recycleBin = new RecycleBin(); 上無法起到作用。
因為在第一次訪問時,線程的 recycleBin 都為空。必須保證后續線程無法進入判斷,否則后續線程仍會創建。

解決方法 3:餓漢式單例

懶漢式:

??????????????? 懶漢式單例指的是當程序第一次訪問單例模式實例時才進行創建。

??????? ? ? ?? 體現對象延遲加載的思想,效率高。盡可能的節約資源,但設計不當會造成線程不安全,代碼相對于餓漢式復雜。第一次加載類對象時反應不快。必須處理好多個線程同時訪問的問題,需通過雙重鎖等機制進行控制,可能會導致系統性能受影響。

餓漢式:

??????????????? 餓漢式單例是當程序啟動時或單例被加載時,單例類實例就已經創建,所有一開始就new了實例。

??? ??? ? ? ? ?? 對象預先加載,線程是安全的,反應速度快。但是資源利用不高,系統加載時間可能會比較長。

????? 濫用單例模式的負面影響:如為了節省資源而將數據庫連接池對象設計為單例類,可能會導致共享連接池對象的程序過多而出現連接池溢出,如果實例化對象長時間不被利用,系統會認為是垃圾而將其回收,這將導致對象狀態的丟失。 ???????????

轉載于:https://www.cnblogs.com/the-wang/p/7270073.html

總結

以上是生活随笔為你收集整理的单例模式(单一实例)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。