谨慎设计一个单例类
?? 如果設計成一個單例類,雖然不存在對象頻繁回收,可要長期占用資源。而且意味著外面對多線程,到了這里需要排隊進入。什么時間設計成單例呢?設計一個單例就意味著, 我們存在資源競爭,必須的,二,我們要頻繁創建對象,銷毀對象(一般最多可見Utility)。資源競爭我們用在數據庫操作,文件操作,隊列,靜態變量。但像上面說的,設計一個單例,問題很多,因為我們設計的想法,就是通用性。處了上面的情況,非必須最好不設計單例模式(效率問題),最佳的方式,讓調用者根據使用情況單例化被調用者。好處是,一,延遲加載了使用時間,二、可以被調用者的銷毀而回收。在設計單例時,我們要分析效率,我們經常設計的單例方式
?
public class VFactory{private static VFactory instance = null;private static object threadSafeLocker = new object();public void Read(){}public void Write(){}public static VFactory Instance{get{if (null == instance){lock (threadSafeLocker){if (null == instance){instance = new VFactory;}}}return instance;}}}
很典型的單例,可問題很多,效率不高,所有線程在進入的時候,都需要排隊,如果一個線程是要執行Read 而另一個要執行Write ,實際的情況我們大部門時間(一個共享變量或隊例,不會改變)在浪費時間,read的時機我們不需要加鎖,而僅僅Write時,所以設計一個靜態方法,不是更好嗎?而且如果是單例,那你必須小心操作它內部的變量不僅是Static 變量,private、 protected 也必須小心,如果不加鎖,也是會出錯誤的。最好辦法,讓它的調用者控制,調用者如果是N個線程,那這N個線程都會指向一個單例地址Copy ,而在調用者內,都存在N份單例的內部變量。
??? 總結:非必須不設計單例模式,(.net 回收很快的) ,讀寫同時存在時,設計靜態方法。讓調者考慮實例方式。
????
轉載于:https://www.cnblogs.com/shouhongxiao/p/3530091.html
總結
- 上一篇: 梦到红帽子什么意思
- 下一篇: 女人梦到螃蟹爬到身上是什么意思