第二個(gè)單例代碼不嚴(yán)謹(jǐn),可能會(huì)創(chuàng)建出多個(gè)實(shí)例。比如有兩個(gè)線(xiàn)程同時(shí)訪(fǎng)問(wèn)getInstance(),當(dāng)?shù)谝粋€(gè)線(xiàn)程進(jìn)入synchronized塊但還沒(méi)有new的時(shí)候,第二個(gè)線(xiàn)程也走到if處,這個(gè)時(shí)候uniqueInstance =null,if返回true,第二個(gè)線(xiàn)程就進(jìn)入了if塊,但在synchronized塊外面等待,然后第一個(gè)線(xiàn)程創(chuàng)建實(shí)例,第二個(gè)線(xiàn)程也能成功創(chuàng)建實(shí)例。
創(chuàng)新互聯(lián)公司專(zhuān)注于南召企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站制作。南召網(wǎng)站建設(shè)公司,為南召等地區(qū)提供建站服務(wù)。全流程按需策劃設(shè)計(jì),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)公司專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)
不知道我說(shuō)得夠不夠清楚。你可以看看《effective Java》這本書(shū),里面有專(zhuān)門(mén)講到這個(gè)問(wèn)題。
單例模式:就是一個(gè)類(lèi)僅創(chuàng)建一個(gè)對(duì)象;
public?class?Singleton?{
private?static?volatile?Singleton?singleton?=?null;
private?Singleton(){}//?構(gòu)造方法
public?static?Singleton?getSingleton(){//?單例模式
if(singleton?==?null){
synchronized?(Singleton.class){
if(singleton?==?null){
singleton?=?new?Singleton();
}
}
}
return?singleton;
}????
}
import?java.util.Date;
public?class?Logger?{
private?static?Logger?instance;
private?static?Class?clazz;
private?Logger()?{
}
private?Logger(Class?clazz)?{
this.instance?=?new?Logger();
this.clazz?=?clazz;
}
public?static?Logger?getLogger(Class?clazz)?{
if?(instance?==?null)?{
synchronized?(Logger.class)?{
if?(instance?==?null)?{
instance?=?new?Logger(clazz);
}
}
}
return?instance;
}
public?void?info(String?msg)?{
System.out.println(clazz.getName()?+?"["?+?new?Date().toLocaleString()
+?"][info]:"?+?msg);
}
public?void?error(String?msg)?{
System.out.println(clazz.getName()?+?"["?+?new?Date().toLocaleString()
+?"][error]:"?+?msg);
}
public?void?warn(String?msg)?{
System.out.println(clazz.getName()?+?"["?+?new?Date().toLocaleString()
+?"][warn]:"?+?msg);
}
public?void?log(String?msg)?{
System.out.println(clazz.getName()?+?"["?+?new?Date().toLocaleString()
+?"][log]:"?+?msg);
}
public?static?void?main(String?args[])?{
Logger?s?=?Logger.getLogger(String.class);
s.info("普通消息");
}
}