public class Sington1 {
private static volatile Sington1 sington1;
private Sington1() {
}
public static Sington1 getInsance() {
if (sington1 == null) {
synchronized (Sington1.class) {
if(sington1==null){
sington1 = new Sington1();
}
}
}
return sington1;
}
}
private static volatile Sington1 sington1;
private Sington1() {
}
public static Sington1 getInsance() {
if (sington1 == null) {
synchronized (Sington1.class) {
if(sington1==null){
sington1 = new Sington1();
}
}
}
return sington1;
}
}
2017-03-31
套路2字惟妙惟肖!如果說(shuō)把編程比作是理發(fā),那么設(shè)計(jì)模式就好比是寸頭、平頭、爆炸頭、蘑菇頭以及鍋蓋頭等等頭型!
2017-03-24
這里講的線程不安全,主要是在判斷是否創(chuàng)建了這個(gè)實(shí)例的代碼塊里。樓上很多贊的那個(gè),提到的方法叫雙重檢查鎖定。
問(wèn)題根源是,instance = new Instance()可以分解成三行偽代碼。正常的順序是分配對(duì)象的內(nèi)存空間->初始化對(duì)象->設(shè)置instance指向剛分配的內(nèi)存地址。注意第2.3步會(huì)被重排序。這時(shí)候instance被分配了內(nèi)存但是沒(méi)有初始化。如果這時(shí)候有一個(gè)線程B來(lái)訪問(wèn),他判斷instance!=null后調(diào)用這個(gè)對(duì)象時(shí)發(fā)現(xiàn)對(duì)象沒(méi)有初始化,就出現(xiàn)bug了~解決方案:1、Instance聲明為volatile類型。2、允許重排序,但是重排序不被其他線程看到。
問(wèn)題根源是,instance = new Instance()可以分解成三行偽代碼。正常的順序是分配對(duì)象的內(nèi)存空間->初始化對(duì)象->設(shè)置instance指向剛分配的內(nèi)存地址。注意第2.3步會(huì)被重排序。這時(shí)候instance被分配了內(nèi)存但是沒(méi)有初始化。如果這時(shí)候有一個(gè)線程B來(lái)訪問(wèn),他判斷instance!=null后調(diào)用這個(gè)對(duì)象時(shí)發(fā)現(xiàn)對(duì)象沒(méi)有初始化,就出現(xiàn)bug了~解決方案:1、Instance聲明為volatile類型。2、允許重排序,但是重排序不被其他線程看到。
2017-03-14
public class Singleton2 {
private Singleton2() {}
private static Singleton2 instance;
public static Singleton2 getInstance() {
if (instance == null) {
synchronized (Singleton2.class) {
if (instance == null) {
instance = new Singleton2();}}}
return instance;
}
}
private Singleton2() {}
private static Singleton2 instance;
public static Singleton2 getInstance() {
if (instance == null) {
synchronized (Singleton2.class) {
if (instance == null) {
instance = new Singleton2();}}}
return instance;
}
}
2017-01-09
餓漢模式:類加載的時(shí)候便進(jìn)行了創(chuàng)建...
額...其實(shí)是因?yàn)閟tatic代碼塊的原因
一個(gè)類運(yùn)行加載進(jìn)入內(nèi)存的時(shí)候 首先加載static靜態(tài)代碼塊
可以搜索一下“考查靜態(tài)語(yǔ)句塊、語(yǔ)句塊以及構(gòu)造函數(shù)的執(zhí)行順序”
弄懂了就知道餓漢模式了
BTW:上面搜索的東西是一道Java面試題
額...其實(shí)是因?yàn)閟tatic代碼塊的原因
一個(gè)類運(yùn)行加載進(jìn)入內(nèi)存的時(shí)候 首先加載static靜態(tài)代碼塊
可以搜索一下“考查靜態(tài)語(yǔ)句塊、語(yǔ)句塊以及構(gòu)造函數(shù)的執(zhí)行順序”
弄懂了就知道餓漢模式了
BTW:上面搜索的東西是一道Java面試題
2017-01-03