摘要:面試時經常會問到關于單例設計模式,因為它能考察的知識點較多且在開發中經常用到。那我就來說一說我對于單例設計模式的一些淺見。還有另一種實現方法稱為懶漢式。但以上代碼會出現線程安全問題。
Java面試時經常會問到關于單例設計模式,因為它能考察的知識點較多且在開發中經常用到。
那我就來說一說我對于單例設計模式的一些淺見。
首先,在Java中,什么是單例呢?
就是保證類在內存中只有一個對象。
那么問題來了,如何才能保證類在內存中只有一個對象呢?
A:把構造方法私有化;
B:在成員變量中自己new一個類實例,并用private將其私有化且用static將其靜態修飾;
C:對外提供一個靜態方法返回這個對象。
依據以上的思路,就可以寫出如下的代碼:
public class Student{ private Student(){} private static Student s=new Student(); public static Student getStudent(){ return s; } }
以上的實現方法在業內稱為”餓漢式”,可以這樣理解:這個單例對象隨著類的加載就被創建出來了,就像餓狼撲食一樣,這里的”狼”就是單例對象,而“食”就是類加載。
還有另一種實現方法稱為“懶漢式”。先看代碼實現:
public class Student{ private Student(){} private static Student s=null; public static Student getStudent() { if(s==null) { s=new Student(); } return s; } }
從代碼中可以看出:這個單例對象是隨著調用類的靜態方法才被被創建的,并不是隨著類的加載而被創建,所以它要滯后于類加載,故稱為“懶漢式”。
但以上代碼會出現線程安全問題。
那就讓我來分析一下為什么會出現線程安全問題
判斷是否會出現線程安全問題必須滿足一下三個條件,缺一不可:
A:是否為多線程環境;
B:是否有共享數據;
C:是否有多條語句操作共享數據
那我就按這三個條件分析以上代碼:
A是有可能的
B共享數據就是 Student對象
C
if(t==null){
t=new Teacher();
}
這里有兩條語句在操作共享數據
那么問題又來了,如何解決線程安全問題呢?
加鎖
而加鎖又有兩種實現方法:1.同步代碼塊;2.同步方法
顯然對以上代碼而言,同步方法是個簡潔明了的。所以修改后的代碼如下:
public class Student{ private Student(){} private static Student s=null; public static synchronized Student getStudent(){ if(s==null) { s=new Student(); } return s; } }
那么,這兩種單例實現代碼的應用場景是什么呢?
答案:開發一般用“餓漢式”,因為它不會出現問題且代碼簡單,面試時用“懶漢式”,因為它不僅考察了單例模式實現,還考察了線程安全。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://m.specialneedsforspecialkids.com/yun/66264.html
摘要:使用的好處知乎的回答不用自己組裝,拿來就用。統一配置,便于修改。 前言 只有光頭才能變強 回顧前面: 給女朋友講解什么是代理模式 包裝模式就是這么簡單啦 單例模式你會幾種寫法? 工廠模式理解了沒有? 在刷Spring書籍的時候花了點時間去學習了單例模式和工廠模式,總的來說還是非常值得的! 本來想的是刷完《Spring 實戰 (第4版)》和《精通Spring4.x 企業應用開發實戰》...
摘要:跳槽時時刻刻都在發生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來期間也沒有準備充分,到底是因為技術原因影響自己的發展,偏移自己規劃的軌跡,還是錢給少了,不受重視。 跳槽時時刻刻都在發生,但是我建議大家跳槽之前,先想清楚為什么要跳槽。切不可跟風,看到同事一個個都走了,自己也盲目的開始面試起來(期間也沒有準備充分),到底是因為技...
摘要:面試題答案領取方式見主頁的缺省端口是多少,怎么修改有哪幾種運行模式優化有幾種部署方式容器是如何創建類實例用到了什么原理如何優化內存怎樣調優垃圾回收怎樣策略調優怎樣共享處理怎樣添加遠程監控專業點的分析工具有哪些關于的數目怎樣監視的內存使用情況 TomcatshowImg(https://segmentfault.com/img/remote/1460000019788819);(面試題+...
閱讀 1661·2021-09-26 09:55
閱讀 5277·2021-09-22 15:40
閱讀 2021·2019-08-30 15:53
閱讀 1504·2019-08-30 11:15
閱讀 1722·2019-08-29 15:41
閱讀 1877·2019-08-28 18:13
閱讀 3153·2019-08-26 12:00
閱讀 1677·2019-08-26 10:30