第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定

synchronized是否限制內(nèi)部代碼的重排序

synchronized所修飾的內(nèi)部代碼是否會(huì)重排序

正在回答

3 回答

補(bǔ)充一個(gè)問題
之前工作的時(shí)候?qū)憜卫J?,舉例如下,主管非得讓加volatile來修飾single,說如果不加會(huì)有重排序問題,從而導(dǎo)致空指針,但是看到大家的討論和老師的回答,我覺得不需要加volatile,因?yàn)閟ynchronized關(guān)鍵字已經(jīng)保證了只會(huì)有一個(gè)線程進(jìn)入創(chuàng)建單例對(duì)象的代碼,當(dāng)這個(gè)線程鎖釋放的時(shí)候,因?yàn)閔appens-before原則,其他線程拿到的單例一定是完整的,也就是說這個(gè)單例的屬性一定是已經(jīng)被賦值的,不會(huì)出現(xiàn)空指針問題,請(qǐng)問老師我的理解準(zhǔn)確嗎

public?class?ExampleSingle?{

????private?volatile?static?ExampleSingle?single;
????????***一些屬性
????private?ExampleSingle()?{
????????????***?假如這里對(duì)這些屬性進(jìn)行了賦值操作
????}

????public?static?ExampleSingle?getInstance()?{
????????if?(single?==?null)?{
????????????synchronized?(ExampleSingle.class)?{
????????????????if?(single?==?null)?{
????????????????????single?=?new?ExampleSingle();
????????????????}
????????????}
????????}
????????return?single;
????}
}


0 回復(fù) 有任何疑惑可以回復(fù)我~
#1

是淚還是累

single = new ExampleSingle(); 大體分為三步 1.分配內(nèi)存 2.初始化 3.將引用指向內(nèi)存地址 你這個(gè)方法 ExampleSingle并沒有加sychronized,所以是不阻塞,可以進(jìn)來,可sychronized并不保證指令重排序,所以3.將引用指向內(nèi)存地址 重排序到2.初始化前,那么就這時(shí)single != null 而直接返回,退出方法,人家還沒有執(zhí)行第二步初始化,所以拿到了一個(gè)未初始化后的single,進(jìn)行操作就會(huì)出現(xiàn)問題,所以需要引入volatile進(jìn)行禁止重排序,禁止了2和3的操作重排序。
2022-08-09 回復(fù) 有任何疑惑可以回復(fù)我~

不會(huì)限制,被synchronized修飾的代碼會(huì)被編譯器或者處理器重排序。多個(gè)線程如果不加同步鎖,重排序可能會(huì)導(dǎo)致可見性問題(線程A中代碼順序不一致可能導(dǎo)致線程B得到錯(cuò)誤的結(jié)果,即使線程A符合as-if-serial語義),而如果加了同步鎖,不會(huì)導(dǎo)致可見性問題,因?yàn)榫€程A的所有操作對(duì)于線程B來說都是可見的。synchronized的作用主要是兩點(diǎn):1.保證有序性:使多個(gè)線程之間有序執(zhí)行,不會(huì)出現(xiàn)交叉執(zhí)行。2.保證可見性:線程解鎖前,必須把共享變量的最新值刷新到主內(nèi)存中,線程加鎖時(shí),需要從主內(nèi)存中重新讀取最新值。


0 回復(fù) 有任何疑惑可以回復(fù)我~

不會(huì),它的作用是在多線程情況下的。單線程下重排序是不會(huì)影響執(zhí)行結(jié)果的。

0 回復(fù) 有任何疑惑可以回復(fù)我~

舉報(bào)

0/150
提交
取消
細(xì)說Java多線程之內(nèi)存可見性
  • 參與學(xué)習(xí)       55900    人
  • 解答問題       89    個(gè)

用兩種方式實(shí)現(xiàn)內(nèi)存可見性,代領(lǐng)大家深層次學(xué)習(xí)Java中的內(nèi)存

進(jìn)入課程

synchronized是否限制內(nèi)部代碼的重排序

我要回答 關(guān)注問題
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)