新聞中心
淺談java內(nèi)存模型

不同的平臺,內(nèi)存模型是不一樣的,但是jvm的內(nèi)存模型規(guī)范是統(tǒng)一的。其實java的多線程并發(fā)問題最終都會反映在java的內(nèi)存模型上,所謂線程安全無非是要控制多個線程對某個資源的有序訪問或修改??偨Yjava的內(nèi)存模型,要解決兩個主要的問題:可見性和有序性。我們都知道計算機有高速緩存的存在,處理器并不是每次處理數(shù)據(jù)都是取內(nèi)存的。JVM定義了自己的內(nèi)存模型,屏蔽了底層平臺內(nèi)存管理細節(jié),對于java開發(fā)人員,要清楚在jvm內(nèi)存模型的基礎上,如果解決多線程的可見性和有序性。
那么,何謂可見性? 多個線程之間是不能互相傳遞數(shù)據(jù)通信的,它們之間的溝通只能通過共享變量來進行。Java內(nèi)存模型(JMM)規(guī)定了jvm有主內(nèi)存,主內(nèi)存是多個線程共享的。當new一個對象的時候,也是被分配在主內(nèi)存中,每個線程都有自己的工作內(nèi)存,工作內(nèi)存存儲了主存的某些對象的副本,當然線程的工作內(nèi)存大小是有限制的。當線程操作某個對象時,執(zhí)行順序如下:
(1) 從主存復制變量到當前工作內(nèi)存 (read and load)
(2) 執(zhí)行代碼,改變共享變量值 (use and assign)
(3) 用工作內(nèi)存數(shù)據(jù)刷新主存相關內(nèi)容 (store and write)
JVM規(guī)范定義了線程對主存的操作指令:read,load,use,assign,store,write。當一個共享變量在多個線程的工作內(nèi)存中都有副本時,如果一個線程修改了這個共享變量,那么其他線程應該能夠看到這個被修改后的值,這就是多線程的可見性問題。
那么,什么是有序性呢 ?線程在引用變量時不能直接從主內(nèi)存中引用,如果線程工作內(nèi)存中沒有該變量,則會從主內(nèi)存中拷貝一個副本到工作內(nèi)存中,這個過程為read-load,完成后線程會引用該副本。當同一線程再度引用該字段時,有可能重新從主存中獲取變量副本(read-load-use),也有可能直接引用原來的副本(use),也就是說 read,load,use順序可以由JVM實現(xiàn)系統(tǒng)決定。
線程不能直接為主存中中字段賦值,它會將值指定給工作內(nèi)存中的變量副本(assign),完成后這個變量副本會同步到主存儲區(qū)(store-write),至于何時同步過去,根據(jù)JVM實現(xiàn)系統(tǒng)決定.有該字段,則會從主內(nèi)存中將該字段賦值到工作內(nèi)存中,這個過程為read-load,完成后線程會引用該變量副本,當同一線程多次重復對字段賦值時,比如:
Java代碼
for(int i=0;i<10;i++) a++;
文章名稱:Java線程安全問題小結_動力節(jié)點Java學院整理-創(chuàng)新互聯(lián)
網(wǎng)頁URL:http://m.biofuelwatch.net/article/dohech.html


咨詢
建站咨詢
