關於單例模式的心結

2022-09-23 11:45:11 字數 1526 閱讀 8869

今天重構公司的**,看到有乙個單例的物件,在整個系統中到處都存在呼叫它的身影,因為我們這個專案會在應用伺服器(server)第一次啟動的時候載入資料庫中的**表(為什麼要先載入,因為這個專案採用的是c/s模式,利用remoting進行通訊,在客戶端啟動的時候會多次獲取**表中的不同資料。)

複製**

1  public class codetablesingleton

2  7    //鎖

8   private static readonly object _lock=new object();

9 10   private static codetablesingleton _instance;

11   

12    public static codetablesingleton instance

13  

23           }

24     }

25   return _instance;

26    }

27 }

28 29 

30 }

複製**

上面**就是專案的實現方式,我了解過單例模式,單例模式是控制物件的建立,可以實現延遲載入,只有在物件被呼叫的時候才會真正的執行物件的例項化,可以在一定程度上減少記憶體的耗用(是在不使用該物件的情況下)。既然在整個系統中只有乙個該物件, 因為專案是採用多執行緒處理客戶端的請求,所以每個執行緒都可以獲取到該物件進行資料的獲取,系統執行也沒發現 由於這個物件的建立或者其他問題。  

但是我深入的想了一下,如果我在單例物件中加入乙個計數器,表示單例物件被呼叫的次數,那麼這個物件內部的屬性 可能會同時被多個執行緒進行更新。

複製**

1 public class singleton

2 //私有的建構函式 確保該例項不能在外部直接通過new例項化

7   public static long totalnum=0;//初始化計數器預設值為0

8   public static singleton instance

9  

20        }

21       }

22       totalnum=totalnum+1; //每次呼叫計數器都會加1

23       return _instance;

24   }

25   }

26 }

複製**  

我嘗試開啟了多個執行緒來執行這段**,沒有發現totalnum的值存在由於多個執行緒的呼叫出現重複資料輸出的情況。那麼我心裡一直在糾結乙個事,就是說假如兩個執行緒都在同一時間獲取到了這個單例物件,那麼都會依次執行計數器加1,如果說兩個執行緒執行到totalnum=totalnum+1 這句話的時候不是在同時的,那麼不會出現問題。

如果這兩個執行緒中了彩票了,同時執行了totalnum=totalnum+1,那麼就會導致計數器少算了一次呼叫嗎?我在測試,開啟了100個執行緒,沒有發現重複的值存在,難道我的理解是錯誤的嗎?我記得在多執行緒下操作同一資料是會出現這個問題的?不知道這個對單例模式是否適用呢?糾結糾結,求準確的回覆  

關於單例模式

單例模式 只能產生乙個例項物件 思路 不能外部new,只能內部new 構造方法要私有,構造方法私有後只能類自己呼叫 需要將物件 通過類自己的來構造例項 的引用變數設定成static修飾的這樣就屬於類本身,只有乙份,即乙個例項物件 構造的物件需要提供給外部,由於無法new物件來呼叫這個方法,因此需要乙...

關於單例模式 建立型

單例模式用來確保每乙個類都有乙個例項,並且自行實體化並且向整個系統提供這個例項,單例模式常常用於避免產生多個物件消耗過多的資源,或者某種型別的資源應該有並且只有乙個,例如訪問資料庫和訪問io的時候就要考慮單例模式。比較經典的單例模式有懶漢式和惡漢式兩種,下面給出這兩種不同方式的uml圖 1.惡漢式 ...

關於單例設計模式的總結

1 什麼是單例設計模式 單例設計模式就是解決乙個類在記憶體中只有乙個物件。想要保證物件唯一 1 為了避免其他程式過多的建立該類物件,選控制其他程式建立該類物件 2 為了讓其他程式可以訪問到該類物件,只好在本類中自定義乙個物件 3 為了方便其他程式對自定義物件訪問,可以對外提供一些訪問方式 2 單例設...