一、vlatile關(guān)鍵字的理解
https://www.cnblogs.com/study-everyday/p/8618802.html
對(duì)于可見性,Java提供了volatile關(guān)鍵字來保證可見性。
當(dāng)一個(gè)共享變量被volatile修飾時(shí),它會(huì)保證修改的值會(huì)立即被更新到主存(中間不在穿插其他指令),當(dāng)有其他線程需要讀取時(shí),它會(huì)去內(nèi)存中讀取新值。
而普通的共享變量不能保證可見性,因?yàn)?b>普通共享變量被修改之后,什么時(shí)候被寫入主存是不確定的(中間可能穿插其他指令),當(dāng)其他線程去讀取時(shí),此時(shí)內(nèi)存中可能還是原來的舊值,因此無(wú)法保證可見性。
Java內(nèi)存模型是通過在變量修改后將新值同步回主內(nèi)存,在變量讀取前從主內(nèi)存刷新變量值這種依賴主內(nèi)存作為傳遞媒介的方式來實(shí)現(xiàn)可見性的,無(wú)論是普通變量還是volatile變量都是如此普通變量與volatile變量的區(qū)別是,volatile的特殊規(guī)則保證了新值能立即同步到主內(nèi)存,以及每次使用前立即從主內(nèi)存刷新。因此我們可以說volatile保證了多線程操作時(shí)變量的可見性,而普通變量則不能保證這一點(diǎn)。
另外,通過synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時(shí)刻只有一個(gè)線程獲取鎖然后執(zhí)行同步代碼,并且在釋放鎖之前會(huì)將對(duì)變量的修改刷新到主存當(dāng)中。因此可以保證可見性。
二、對(duì)于先行發(fā)生的理解
http://www.itdecent.cn/p/8c6efbb80e5d
三、AQS源碼解析
https://www.cnblogs.com/micrari/p/6937995.html
四、線程池
http://www.itdecent.cn/p/9a8c81066201
五、二進(jìn)制運(yùn)算
byte:1個(gè)字節(jié) 8位 -128~127
short?:2個(gè)字節(jié) 16位char:2個(gè)字節(jié) 16bit
int?:4個(gè)字節(jié) 32位float:4個(gè)字節(jié) 32bit
long:8個(gè)字節(jié) 64位double?:8個(gè)字節(jié) 64bit
有符號(hào)右移>>: 右移之后, 左邊的補(bǔ)上符號(hào)位, 正數(shù)補(bǔ)0, 負(fù)數(shù)補(bǔ)1。
無(wú)符號(hào)右移>>>: 右移之后, 無(wú)論該數(shù)是正數(shù)還是負(fù)數(shù), 右移之后左邊都是補(bǔ)上0。
https://blog.csdn.net/qq_25406563/article/details/83277660
六、synchornized底層原理:?
?https://blog.csdn.net/github_38838414/article/details/81110128