更新時間:2023-01-30 14:40:32 來源:動力節(jié)點 瀏覽1425次
在我們經(jīng)歷過Java面試時會發(fā)現(xiàn),面試官問到最多的問題基本圍繞著單例設(shè)計模式。因為它的知識考點是比較多的,并且也是我們在開發(fā)過程中會經(jīng)常用到的。所以,熟知一些高頻出現(xiàn)的相關(guān)面試題,對于我們?nèi)蘸蟮拿嬖嚂泻艽蟮膸椭?/p>
首先,在Java中,什么是單例呢?
就是保證類在內(nèi)存中只有一個對象。
那么問題來了,如何才能保證類在內(nèi)存中只有一個對象呢?
A:把構(gòu)造方法私有化;
B:在成員變量中自己new一個類實例,并用private將其私有化且用static將其靜態(tài)修飾;
C:對外提供一個靜態(tài)方法返回這個對象。
依據(jù)以上的思路,就可以寫出如下的代碼:
public class Student{
private Student(){}
private static Student s=new Student();
public static Student getStudent(){
return s;
}
}
以上的實現(xiàn)方法在業(yè)內(nèi)稱為”餓漢式”,可以這樣理解:這個單例對象隨著類的加載就被創(chuàng)建出來了,就像餓狼撲食一樣,這里的”狼”就是單例對象,而“食”就是類加載。
還有另一種實現(xiàn)方法稱為“懶漢式”。先看代碼實現(xiàn):
public class Student{
private Student(){}
private static Student s=null;
public static Student getStudent()
{
if(s==null)
{
s=new Student();
}
return s;
}
}
從代碼中可以看出:這個單例對象是隨著調(diào)用類的靜態(tài)方法才被被創(chuàng)建的,并不是隨著類的加載而被創(chuàng)建,所以它要滯后于類加載,故稱為“懶漢式”。
但以上代碼會出現(xiàn)線程安全問題。
那就讓我來分析一下為什么會出現(xiàn)線程安全問題
判斷是否會出現(xiàn)線程安全問題必須滿足一下三個條件,缺一不可:
A:是否為多線程環(huán)境;
B:是否有共享數(shù)據(jù);
C:是否有多條語句操作共享數(shù)據(jù)
那我就按這三個條件分析以上代碼:
A是有可能的
B共享數(shù)據(jù)就是 Student對象
C
if(t==null){
t=new Teacher();
}
這里有兩條語句在操作共享數(shù)據(jù)
那么問題又來了,如何解決線程安全問題呢?
加鎖
而加鎖又有兩種實現(xiàn)方法: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;
}
}
那么,這兩種單例實現(xiàn)代碼的應(yīng)用場景是什么呢?
答案:開發(fā)一般用“餓漢式”,因為它不會出現(xiàn)問題且代碼簡單,面試時用“懶漢式”,因為它不僅考察了單例模式實現(xiàn),還考察了線程安全。
以上就是“Java單例模式面試題,實戰(zhàn)代碼舉例”,你能回答上來嗎?如果想要了解更多的Java面試題相關(guān)內(nèi)容,可以關(guān)注動力節(jié)點Java官網(wǎng)。
相關(guān)閱讀