重慶分公司,新征程啟航
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
為企業(yè)提供網(wǎng)站建設(shè)、域名注冊、服務(wù)器等服務(wù)
第二個單例代碼不嚴謹,可能會創(chuàng)建出多個實例。比如有兩個線程同時訪問getInstance(),當?shù)谝粋€線程進入synchronized塊但還沒有new的時候,第二個線程也走到if處,這個時候uniqueInstance =null,if返回true,第二個線程就進入了if塊,但在synchronized塊外面等待,然后第一個線程創(chuàng)建實例,第二個線程也能成功創(chuàng)建實例。
創(chuàng)新互聯(lián)公司專注于南召企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站,商城網(wǎng)站制作。南召網(wǎng)站建設(shè)公司,為南召等地區(qū)提供建站服務(wù)。全流程按需策劃設(shè)計,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
不知道我說得夠不夠清楚。你可以看看《effective Java》這本書,里面有專門講到這個問題。
單例模式:就是一個類僅創(chuàng)建一個對象;
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("普通消息");
}
}