日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
講解一下Java內(nèi)存模型

Java內(nèi)存結(jié)構(gòu)是每個(gè)java程序員必須掌握理解的,這是Java的核心基礎(chǔ),對(duì)我們編寫代碼特別是并發(fā)編程時(shí)有很大幫助。由于Java程序是交由JVM執(zhí)行的,所以我們?cè)谡凧ava內(nèi)存區(qū)域劃分的時(shí)候事實(shí)上是指JVM內(nèi)存區(qū)域劃分。

為田家庵等地區(qū)用戶提供了全套網(wǎng)頁設(shè)計(jì)制作服務(wù),及田家庵網(wǎng)站建設(shè)行業(yè)解決方案。主營業(yè)務(wù)為成都網(wǎng)站設(shè)計(jì)、做網(wǎng)站、成都外貿(mào)網(wǎng)站建設(shè)公司、田家庵網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長期合作。這樣,我們也可以走得更遠(yuǎn)!

Java內(nèi)存模型的規(guī)定:

所有變量存儲(chǔ)在主內(nèi)存中;
每個(gè)線程都有自己的工作內(nèi)存,且對(duì)變量的操作都是在工作內(nèi)存中進(jìn)行;
不同線程之間無法直接訪問彼此工作內(nèi)存中的變量,要想訪問只能通過主內(nèi)存來傳遞。

Java的線程、工作內(nèi)存、主內(nèi)存關(guān)系如下圖所示:

具體變量從主內(nèi)存到工作內(nèi)存,以及從工作內(nèi)存轉(zhuǎn)回主內(nèi)存的實(shí)現(xiàn)細(xì)節(jié),由下面八個(gè)原子性的操作完成:

lock:作用于主內(nèi)存變量,將該變量標(biāo)識(shí)為一個(gè)線程獨(dú)占的狀態(tài)

unlock:作用于主內(nèi)存變量,將獨(dú)占狀態(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)存變量中

同時(shí)還對(duì)上述八個(gè)操作進(jìn)行了一些細(xì)節(jié)的要求,比如read/load、store/write必須成對(duì)出現(xiàn),未執(zhí)行過lock的變量不能執(zhí)行unlock操作等。

劃重點(diǎn),此處面試常遇到的問題就是對(duì)于volatile關(guān)鍵字的解讀。

volatile關(guān)鍵字

此關(guān)鍵字修飾的變量具有兩種效果:1、保證線程間的可見性;2、阻止指令重排序

對(duì)于1的實(shí)現(xiàn),它保證load與use必須相鄰調(diào)用,即要use這個(gè)變量,必定先執(zhí)行read/load,這樣每次都能獲取到最新的變量值;它又保證asign與store必須相鄰調(diào)用,即在工作內(nèi)存中將該變量改了之后,必定會(huì)先同步到主內(nèi)存中。這樣,volatile關(guān)鍵字實(shí)現(xiàn)了可見性。至于阻止指令重排序,還是移步《深入理解Java虛擬機(jī)》一書吧,貧道水平有限,就不在這里說了。

從另一個(gè)角度來分析,Java內(nèi)存模型是圍繞著在并發(fā)過程中如何處理原子性、可見性、有序性來建立的。原子性:八個(gè)原子性操作,以及synchronized(lock/unlock未直接開放給用戶,synchronized通過monitorenter跟monitorexit指令調(diào)用的lock/unlock操作)

可見性:volatile、synchronized、final這三個(gè)關(guān)鍵字均通過不同方式實(shí)現(xiàn)了可見性

有序性:volatile、synchronized 這兩個(gè)關(guān)鍵字保證有序性,同時(shí)還有先行發(fā)生(happens-before)原則來保證隱含的默認(rèn)有序性

下面說說happens-before先行發(fā)生原則,先行發(fā)生原則用通俗語言表述就是:如果操作A在操作B之前發(fā)生,那么A產(chǎn)生的影響B(tài)同樣能觀測(cè)到。那么問題來了,先行發(fā)生原則都有哪些呢?同樣有八條,如下:

程序次序規(guī)則:同一個(gè)線程中按照代碼的順序依次執(zhí)行

管程鎖定規(guī)則:對(duì)于同一個(gè)鎖,unlock先行發(fā)生于后面的lock,即unlock了才會(huì)lock

volatile變量規(guī)則:對(duì)一個(gè)volatile變量的寫操作先行發(fā)生于后面對(duì)該變量的讀操作,即寫完了才會(huì)讀

線程啟動(dòng)規(guī)則:一個(gè)線程的start()方法先行發(fā)生于此線程的任何一個(gè)動(dòng)作

線程終止規(guī)則:一個(gè)線程的所有動(dòng)作先行發(fā)生于該線程的終止檢測(cè)

線程中斷規(guī)則:對(duì)一個(gè)線程interrupt()方法的調(diào)用先行發(fā)生于線程的中斷檢測(cè)Thread.interrpted()

對(duì)象終結(jié)規(guī)則:對(duì)象的初始化完成先行發(fā)生于finalize()方法

傳遞性:顧名思義,A先行發(fā)生于B,B先行發(fā)生于C,則A一定先行發(fā)生于C

總結(jié)

Java內(nèi)存模型基本就這些內(nèi)容,如果都掌握了的話,非一線互聯(lián)網(wǎng)公司基本都能應(yīng)對(duì)自如了(因?yàn)橐痪€互聯(lián)網(wǎng)公司貧道本人也沒進(jìn)去>


網(wǎng)頁標(biāo)題:講解一下Java內(nèi)存模型
URL標(biāo)題:http://www.dlmjj.cn/article/cdjhegp.html