新聞中心
Java內(nèi)存結構是每個java程序員必須掌握理解的,這是Java的核心基礎,對我們編寫代碼特別是并發(fā)編程時有很大幫助。由于Java程序是交由JVM執(zhí)行的,所以我們在談Java內(nèi)存區(qū)域劃分的時候事實上是指JVM內(nèi)存區(qū)域劃分。

為田家庵等地區(qū)用戶提供了全套網(wǎng)頁設計制作服務,及田家庵網(wǎng)站建設行業(yè)解決方案。主營業(yè)務為成都網(wǎng)站設計、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設公司、田家庵網(wǎng)站設計,以傳統(tǒng)方式定制建設網(wǎng)站,并提供域名空間備案等一條龍服務,秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務。我們深信只要達到每一位用戶的要求,就會得到認可,從而選擇與我們長期合作。這樣,我們也可以走得更遠!
Java內(nèi)存模型的規(guī)定:
Java的線程、工作內(nèi)存、主內(nèi)存關系如下圖所示:
具體變量從主內(nèi)存到工作內(nèi)存,以及從工作內(nèi)存轉回主內(nèi)存的實現(xiàn)細節(jié),由下面八個原子性的操作完成:
lock:作用于主內(nèi)存變量,將該變量標識為一個線程獨占的狀態(tài)
unlock:作用于主內(nèi)存變量,將獨占狀態(tài)釋放
read:作用于主內(nèi)存變量,將值拷貝到工作內(nèi)存中
load:作用于工作內(nèi)存中的變量,將值放到工作內(nèi)存中的變量副本中
use:作用于工作內(nèi)存中的變量,將值傳給執(zhí)行引擎
asign:作用于工作內(nèi)存中的變量,將執(zhí)行引擎中的值賦給工作內(nèi)存中的變量
store:作用于工作內(nèi)存中的變量,將值傳給主內(nèi)存
write:作用于主內(nèi)存中的變量,將工作內(nèi)存中返回的值放到主內(nèi)存變量中
同時還對上述八個操作進行了一些細節(jié)的要求,比如read/load、store/write必須成對出現(xiàn),未執(zhí)行過lock的變量不能執(zhí)行unlock操作等。
劃重點,此處面試常遇到的問題就是對于volatile關鍵字的解讀。
volatile關鍵字
此關鍵字修飾的變量具有兩種效果:1、保證線程間的可見性;2、阻止指令重排序
對于1的實現(xiàn),它保證load與use必須相鄰調(diào)用,即要use這個變量,必定先執(zhí)行read/load,這樣每次都能獲取到最新的變量值;它又保證asign與store必須相鄰調(diào)用,即在工作內(nèi)存中將該變量改了之后,必定會先同步到主內(nèi)存中。這樣,volatile關鍵字實現(xiàn)了可見性。至于阻止指令重排序,還是移步《深入理解Java虛擬機》一書吧,貧道水平有限,就不在這里說了。
從另一個角度來分析,Java內(nèi)存模型是圍繞著在并發(fā)過程中如何處理原子性、可見性、有序性來建立的。原子性:八個原子性操作,以及synchronized(lock/unlock未直接開放給用戶,synchronized通過monitorenter跟monitorexit指令調(diào)用的lock/unlock操作)
可見性:volatile、synchronized、final這三個關鍵字均通過不同方式實現(xiàn)了可見性
有序性:volatile、synchronized 這兩個關鍵字保證有序性,同時還有先行發(fā)生(happens-before)原則來保證隱含的默認有序性
下面說說happens-before先行發(fā)生原則,先行發(fā)生原則用通俗語言表述就是:如果操作A在操作B之前發(fā)生,那么A產(chǎn)生的影響B(tài)同樣能觀測到。那么問題來了,先行發(fā)生原則都有哪些呢?同樣有八條,如下:
程序次序規(guī)則:同一個線程中按照代碼的順序依次執(zhí)行
管程鎖定規(guī)則:對于同一個鎖,unlock先行發(fā)生于后面的lock,即unlock了才會lock
volatile變量規(guī)則:對一個volatile變量的寫操作先行發(fā)生于后面對該變量的讀操作,即寫完了才會讀
線程啟動規(guī)則:一個線程的start()方法先行發(fā)生于此線程的任何一個動作
線程終止規(guī)則:一個線程的所有動作先行發(fā)生于該線程的終止檢測
線程中斷規(guī)則:對一個線程interrupt()方法的調(diào)用先行發(fā)生于線程的中斷檢測Thread.interrpted()
對象終結規(guī)則:對象的初始化完成先行發(fā)生于finalize()方法
傳遞性:顧名思義,A先行發(fā)生于B,B先行發(fā)生于C,則A一定先行發(fā)生于C
總結
Java內(nèi)存模型基本就這些內(nèi)容,如果都掌握了的話,非一線互聯(lián)網(wǎng)公司基本都能應對自如了(因為一線互聯(lián)網(wǎng)公司貧道本人也沒進去>
本文標題:講解一下Java內(nèi)存模型
分享網(wǎng)址:http://fisionsoft.com.cn/article/cdjhegp.html


咨詢
建站咨詢
