日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

codedot,內(nèi)存模型

java虛擬機(jī)內(nèi)存模型?

codedot,內(nèi)存模型


Java虛擬機(jī)相當(dāng)于一個(gè)抽象的計(jì)算機(jī)操作系統(tǒng),其管理的內(nèi)存區(qū)域大體上可以分為棧和堆,就像c或c中對(duì)內(nèi)存的分類一樣,但這樣的分類對(duì)于Java虛擬機(jī)來(lái)說(shuō)太過(guò)粗淺,實(shí)際上Java虛擬機(jī)管理的內(nèi)存區(qū)域分為程序計(jì)數(shù)器、虛擬機(jī)棧、本地方法棧、堆和方法區(qū),根據(jù)各區(qū)域是屬于線程私有還是由線程共享,這些區(qū)域可以分為兩類,下面分別進(jìn)行說(shuō)明 。
Java內(nèi)存模型的核心問(wèn)題就是如何解決一致性問(wèn)題?
codedot,內(nèi)存模型


【codedot,內(nèi)存模型】java內(nèi)存模型其實(shí)是跟計(jì)算機(jī)硬件發(fā)展息息相關(guān)的,CPU的運(yùn)算能力相比較于硬盤(pán),內(nèi)存的存取能力是相當(dāng)高的,就好比我(CPU)分明能一分鐘從1加到100,你(內(nèi)存)卻只能給到我1到10,內(nèi)存的存取大大的限制了CPU的運(yùn)算,所以就在內(nèi)存和CPU中間加了高速緩存,用于CPU的快速計(jì)算,如下圖:JAVA內(nèi)存模型也采用了相似的結(jié)構(gòu),線程與CPU交互的時(shí)候,為了快速的進(jìn)行運(yùn)算,線程本地會(huì)開(kāi)辟一份內(nèi)存用于數(shù)據(jù)存儲(chǔ),然后快速的與CPU進(jìn)行交互,CPU的運(yùn)算數(shù)據(jù)也通過(guò)線程推送到內(nèi)存中,如下圖:現(xiàn)在問(wèn)題來(lái)了,從CPU到主內(nèi)存需要經(jīng)過(guò)線程的本地內(nèi)存,在多線程的環(huán)境下,如果CPU運(yùn)算數(shù)據(jù)不能及時(shí)的推到主內(nèi)存中,就引發(fā)了線程安全問(wèn)題,比如java中的經(jīng)典案例i=0;i;這么一個(gè)簡(jiǎn)單地語(yǔ)句,如果線程1將i變?yōu)?之后還沒(méi)來(lái)得及寫(xiě)到主內(nèi)存中,線程2也是用i=0這個(gè)數(shù)據(jù)去運(yùn)算,那么原本i兩次之后應(yīng)該得到2,現(xiàn)在卻只能輸出1;由此可見(jiàn)java內(nèi)存模型是模擬計(jì)算機(jī)硬件設(shè)計(jì)的,主要的作用其實(shí)還是用來(lái)提升整個(gè)系統(tǒng)的運(yùn)算能力,但卻由此產(chǎn)生了多線程的線程安全問(wèn)題,線程安全的主要問(wèn)題是原子性,可見(jiàn)性,有序性問(wèn)題; 怎么解決線程安全的問(wèn)題呢? 1,資源不共享:比如TheadLocal,數(shù)據(jù)直接放在線程的本地內(nèi)存中,每個(gè)線程有一份自己的數(shù)據(jù),不存在安全問(wèn)題2,資源共享但是加鎖:比如synchronize,reentrantLock等,將共享資源進(jìn)行加鎖,只有在保證線程處理完成或者中斷的時(shí)候,才會(huì)讓別的線程繼續(xù)處理這份數(shù)據(jù); 3,資源共享但是無(wú)鎖:比如AtomicBoolean,AtomicInteger等主要是使用CAS保證數(shù)據(jù)的原子性操作,使用volatile保證數(shù)據(jù)的可見(jiàn)性來(lái)保證數(shù)據(jù)安全; 本文提到的東西比較淺顯易懂,更多深入的,精彩的java方面的技術(shù)分享正在路上,需要的朋友敬請(qǐng)關(guān)注 。

    推薦閱讀