×

Java內(nèi)存模型與線程

  • 作者:新網(wǎng)
  • 來(lái)源:新網(wǎng)
  • 瀏覽:100
  • 2018-05-15 14:40:56

內(nèi)存模型:說(shuō)了這么多的內(nèi)存模型,到底什么是內(nèi)存模型呢?特定的操作協(xié)議下,對(duì)特定的內(nèi)存或高速緩存進(jìn)行讀寫訪問(wèn)的過(guò)程抽象。

   內(nèi)存模型:說(shuō)了這么多的內(nèi)存模型,到底什么是內(nèi)存模型呢?特定的操作協(xié)議下,對(duì)特定的內(nèi)存或高速緩存進(jìn)行讀寫訪問(wèn)的過(guò)程抽象。

1429080380361897.jpg

<div>  它的作用是定義程序中各個(gè)共享的變量的訪問(wèn)規(guī)則,即如何將變量寫入內(nèi)存和從內(nèi)存中取出變量。Java內(nèi)存模型有主內(nèi)存與工作內(nèi)存之分,所有變量存在主內(nèi)存中,線程則是擁有自己的工作內(nèi)存,它是主內(nèi)存的副本拷貝,線程只能讀寫工作內(nèi)存。
  8種原子操作
  ·lock(鎖定):作用于主內(nèi)存的變量,它把一個(gè)變量標(biāo)識(shí)為一條線程獨(dú)占的狀態(tài)。
   unlock(解鎖):作用于主內(nèi)存的變量,它把一個(gè)處于鎖定狀態(tài)的變量釋放出來(lái),釋放后的變量才可以被其他線程鎖定。
   read(讀取):作用于主內(nèi)存的變量,它把一個(gè)變量的值從主內(nèi)存?zhèn)鬏數(shù)骄€程的工作內(nèi)存中,以便隨后的 load 動(dòng)作使用。
   load(載入):作用于工作內(nèi)存的變量,它把 read 操作從主內(nèi)存中得到的變量值放入工作內(nèi)存的變量副本中。
   use(使用):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳遞給執(zhí)行引擎,每當(dāng)虛擬機(jī)遇到一個(gè)需要使用到變量的值的字節(jié)碼指令時(shí)將會(huì)執(zhí)行這個(gè)操作。
  ·assign(賦值):作用于工作內(nèi)存的變量,它把一個(gè)從執(zhí)行引擎接收到的值賦給工作內(nèi)存的變量,每當(dāng)虛擬機(jī)遇到一個(gè)給變量賦值的字節(jié)碼指令時(shí)執(zhí)行這個(gè)操作。
   store(存儲(chǔ)):作用于工作內(nèi)存的變量,它把工作內(nèi)存中一個(gè)變量的值傳送到主內(nèi)存中,以便隨后的 write 操作使用。
   write(寫入):作用于主內(nèi)存的變量,它把 store 操作從工作內(nèi)存中得到的變量的值放入主內(nèi)存的變量中。
  volatile變量的特殊規(guī)則
  volatile的特性是保證此變量對(duì)所有線程的可見(jiàn)性,即當(dāng)變量的值修改后,其他線程可以立即知道發(fā)生的變化。普通變量則是修改完值后,需要寫回主內(nèi)存,然后其他線程再?gòu)闹鲀?nèi)存讀取該數(shù)據(jù)。volatile還可以通過(guò)內(nèi)存屏障來(lái)禁止指令的重排序。綜合來(lái)講它的讀操作和普通變量差不多,寫操作慢一點(diǎn)。
  long和double變量的特殊規(guī)則
       8種操作一般都是原子性的,但是對(duì)于64位的數(shù)據(jù),內(nèi)存模型允許將沒(méi)有被volatile修飾的64位數(shù)據(jù)的讀寫操作劃分為兩次32位的操作進(jìn)行---->非原子協(xié)定但一般我們不需要將long和double聲明為volatile。
       以上就是小編的分享,各位可以在下面留言交流。

免責(zé)聲明:本文內(nèi)容由互聯(lián)網(wǎng)用戶自發(fā)貢獻(xiàn)自行上傳,本網(wǎng)站不擁有所有權(quán),也不承認(rèn)相關(guān)法律責(zé)任。如果您發(fā)現(xiàn)本社區(qū)中有涉嫌抄襲的內(nèi)容,請(qǐng)發(fā)送郵件至:operations@xinnet.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),本站將立刻刪除涉嫌侵權(quán)內(nèi)容。

免費(fèi)咨詢獲取折扣

Loading