我想問一下 各位大神 那個(gè)發(fā)送下載進(jìn)度給activity mfinished是單個(gè)線程的完成度吧 應(yīng)該是傳過去所有線程的已經(jīng)下載的進(jìn)度吧 不解啊 這里
2017-05-15
接上一條評論:
當(dāng)?shù)谝粋€(gè)線程執(zhí)行到行1,已進(jìn)入if內(nèi),但還沒有執(zhí)行行2時(shí),即sHelper依然為null,此時(shí)系統(tǒng)如果切換到第二個(gè)線程執(zhí)行,第二個(gè)線程依然能進(jìn)入if內(nèi),然后new一個(gè)并返回一個(gè)sHelper實(shí)例(假設(shè)內(nèi)存地址為0x000012)。然后系統(tǒng)切換回線程1,繼續(xù)在if內(nèi)向下執(zhí)行,此時(shí)它也會new一個(gè)實(shí)例(假設(shè)內(nèi)存地址為0x000023)并返回。這樣的話,各線程拿到的實(shí)例是不同的,在寫數(shù)據(jù)庫時(shí)依然會發(fā)生加鎖情況。
給方法加同步,或用雙重檢測可解決,不了解的同學(xué)建議看看單例模式的七種寫法(亦有說八種)及它們各自的優(yōu)缺點(diǎn)。
當(dāng)?shù)谝粋€(gè)線程執(zhí)行到行1,已進(jìn)入if內(nèi),但還沒有執(zhí)行行2時(shí),即sHelper依然為null,此時(shí)系統(tǒng)如果切換到第二個(gè)線程執(zhí)行,第二個(gè)線程依然能進(jìn)入if內(nèi),然后new一個(gè)并返回一個(gè)sHelper實(shí)例(假設(shè)內(nèi)存地址為0x000012)。然后系統(tǒng)切換回線程1,繼續(xù)在if內(nèi)向下執(zhí)行,此時(shí)它也會new一個(gè)實(shí)例(假設(shè)內(nèi)存地址為0x000023)并返回。這樣的話,各線程拿到的實(shí)例是不同的,在寫數(shù)據(jù)庫時(shí)依然會發(fā)生加鎖情況。
給方法加同步,或用雙重檢測可解決,不了解的同學(xué)建議看看單例模式的七種寫法(亦有說八種)及它們各自的優(yōu)缺點(diǎn)。
2017-05-07
提醒下后來的同學(xué):
視頻中的單例模式是不安全的,不能保證只產(chǎn)生單例。
if(sHelper==null){ // 行1
sHelper = new DatabaseHelper(context); //行2
}
return sHelper; // 行3
視頻中的單例模式是不安全的,不能保證只產(chǎn)生單例。
if(sHelper==null){ // 行1
sHelper = new DatabaseHelper(context); //行2
}
return sHelper; // 行3
2017-05-07