• <input id="qucwm"><u id="qucwm"></u></input>
  • <menu id="qucwm"></menu>
  • <input id="qucwm"><tt id="qucwm"></tt></input>
  • <input id="qucwm"><acronym id="qucwm"></acronym></input>
  • 標簽 ‘ faq

    Java內存模型FAQ(十三)為什么我需要關注java內存模型

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#conclusion
    譯者:Alex

    為什么你需要關注java內存模型?并發程序的bug非常難找。它們經常不會在測試中發生,而是直到你的程序運行在高負荷的情況下才發生,非常難于重現和跟蹤。你需要花費更多的努力提前保證你的程序是正確同步的。這不容易,但是它比調試一個沒有正確同步的程序要容易的多。

    閱讀全文

    Java內存模型FAQ(十二)如果我需要寫一個VM,我需要做些什么

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#vmwriters
    譯者:Alex

    參見:http://gee.cs.oswego.edu/dl/jmm/cookbook.html?(譯文參見:JMM Cookbook)
    閱讀全文

    Java內存模型FAQ(十一)新的內存模型是否修復了雙重鎖檢查問題?

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#dcl
    譯者:Alex

    臭名昭著的雙重鎖檢查(也叫多線程單例模式)是一個騙人的把戲,它用來支持lazy初始化,同時避免過度使用同步。在非常早的JVM中,同步非常慢,開發人員非常希望刪掉它。 閱讀全文

    Java內存模型FAQ(十)volatile是干什么用的

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html#volatile
    譯者:Alex

    Volatile字段是用于線程間通訊的特殊字段。每次讀volatile字段都會看到其它線程寫入該字段的最新值;實際上,程序員之所以要定義volatile字段是因為在某些情況下由于緩存和重排序所看到的陳舊的變量值是不可接受的。編譯器和運行時禁止在寄存器里面分配它們。它們還必須保證,在它們寫好之后,它們被從緩沖區刷新到主存中,因此,它們立即能夠對其他線程可見。相同地,在讀取一個volatile字段之前,緩沖區必須失效,因為值是存在于主存中而不是本地處理器緩沖區。在重排序訪問volatile變量的時候還有其他的限制。 閱讀全文

    Java內存模型FAQ(九)在新的Java內存模型中,final字段是如何工作的

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第九章
    譯者:Alex

    一個對象的final字段值是在它的構造方法里面設置的。假設對象被正確的構造了,一旦對象被構造,在構造方法里面設置給final字段的的值在沒有同步的情況下對所有其他的線程都會可見。另外,引用這些final字段的對象或數組都將會看到final字段的最新值。 閱讀全文

    Java內存模型FAQ(八)Final字段如何改變它們的值

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第八章

    譯者:Alex

    我們可以通過分析String類的實現具體細節來展示一個final變量是如何可以改變的。

    String對象包含了三個字段:一個character數組,一個數組的offset和一個length。實現String類的基本原理為:它不僅僅擁有character數組,而且為了避免多余的對象分配和拷貝,多個String和StringBuffer對象都會共享相同的character數組。因此,String.substring()方法能夠通過改變length和offset,而共享原始的character數組來創建一個新的String。對一個String來說,這些字段都是final型的字段。

    String s1 = "/usr/tmp";
    String s2 = s1.substring(4); 
    

    字符串s2的offset的值為4,length的值為4。但是,在舊的內存模型下,對其他線程來說,看到offset擁有默認的值0是可能的,而且,稍后一點時間會看到正確的值4,好像字符串的值從“/usr”變成了“/tmp”一樣。

    舊的Java內存模型允許這些行為,部分JVM已經展現出這樣的行為了。在新的Java內存模型里面,這些是非法的。

    原文

    How can final fields appear to change their values?

    One of the best examples of how final fields’ values can be seen to change involves one particular implementation of the?String?class.

    A?String?can be implemented as an object with three fields — a character array, an offset into that array, and a length. The rationale for implementing?String?this way, instead of having only the character array, is that it lets multiple?String?and?StringBufferobjects share the same character array and avoid additional object allocation and copying. So, for example, the method?String.substring()?can be implemented by creating a new string which shares the same character array with the original?String?and merely differs in the length and offset fields. For a?String, these fields are all final fields.

    String s1 = "/usr/tmp";
    String s2 = s1.substring(4); 
    

    The string?s2?will have an offset of 4 and a length of 4. But, under the old model, it was possible for another thread to see the offset as having the default value of 0, and then later see the correct value of 4, it will appear as if the string “/usr” changes to “/tmp”.

    The original Java Memory Model allowed this behavior; several JVMs have exhibited this behavior. The new Java Memory Model makes this illegal.

    Java內存模型FAQ(七)同步會干些什么呢

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第七章

    譯者:Alex

    同步有幾個方面的作用。最廣為人知的就是互斥?——一次只有一個線程能夠獲得一個監視器,因此,在一個監視器上面同步意味著一旦一個線程進入到監視器保護的同步塊中,其他的線程都不能進入到同一個監視器保護的塊中間,除非第一個線程退出了同步塊。

    閱讀全文

    Java內存模型FAQ(六)沒有正確同步的含義是什么?

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第六章

    譯者:Alex

    沒有正確同步的代碼對于不同的人來說可能會有不同的理解。在Java內存模型這個語義環境下,我們談到“沒有正確同步”,我們的意思是:

    1. 一個線程中有一個對變量的寫操作,
    2. 另外一個線程對同一個變量有讀操作,
    3. 而且寫操作和讀操作沒有通過同步來保證順序。

    當這些規則被違反的時候,我們就說在這個變量上有一個“數據競爭”(data race)。一個有數據競爭的程序就是一個沒有正確同步的程序。

    閱讀全文

    Java內存模型FAQ(五)舊的內存模型有什么問題?

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第五章

    譯者:Alex

    舊的內存模型中有幾個嚴重的問題。這些問題很難理解,因此被廣泛的違背。例如,舊的存儲模型在許多情況下,不允許JVM發生各種重排序行為。舊的內存模型中讓人產生困惑的因素造就了JSR-133規范的誕生。

    閱讀全文

    Java內存模型FAQ(三)JSR133是什么?

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第三章

    譯者:Alex

    從1997年以來,人們不斷發現Java語言規范的17章定義的Java內存模型中的一些嚴重的缺陷。這些缺陷會導致一些使人迷惑的行為(例如final字段會被觀察到值的改變)和破壞編譯器常見的優化能力。
    閱讀全文

    Java內存模型FAQ(四)重排序意味著什么?

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第四章

    譯者:Alex

    在很多情況下,訪問一個程序變量(對象實例字段,類靜態字段和數組元素)可能會使用不同的順序執行,而不是程序語義所指定的順序執行。編譯器能夠自由的以優化的名義去改變指令順序。在特定的環境下,處理器可能會次序顛倒的執行指令。數據可能在寄存器,處理器緩沖區和主內存中以不同的次序移動,而不是按照程序指定的順序。
    閱讀全文

    Java內存模型FAQ(二) 其他語言,像C++,也有內存模型嗎?

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html?第二章

    譯者:Alex

    大部分其他的語言,像C和C++,都沒有被設計成直接支持多線程。這些語言對于發生在編譯器和處理器平臺架構的重排序行為的保護機制會嚴重的依賴于程序中所使用的線程庫(例如pthreads),編譯器,以及代碼所運行的平臺所提供的保障。

    閱讀全文

    Java內存模型FAQ

    原文:http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html? 譯者:Alex,方騰飛

    目錄

    1. 什么是內存模型?
    2. 其他語言,像c++,也有內存模型嗎?
    3. JSR 133是什么?
    4. 重排序是什么?
    5. 舊內存模型有什么錯誤?
    6. 沒有正確同步的含義是什么?
    7. 同步會做些什么呢?
    8. final字段如何改變它們的值?
    9. 在新的JMM下final字段是如何工作的?
    10. volatile是干什么用的?
    11. 新內存模型是否修復了雙重鎖檢查問題?
    12. 如果我要實現一個JVM,我需要做什么?
    13. 為什么要關注JMM?

    return top

    淘宝彩票网 qe6| zps| w7p| aue| 7qy| sr7| hi7| cus| a7m| kuj| 7tw| ib8| jcb| k6r| mzi| 6la| yz6| rsm| c6g| lwy| eqz| 77n| rjb| 7jj| ye5| wzb| v5e| vwz| 5te| oh5| jbm| s6g| msv| cvx| 6yb| km4| qga| m4c| lvg| 4sw| nu5| jau| d5k| nxj| 5xa| ueq| wb5| zju| h3l| nwq| r4w| mee| 4sr| aa4| thr| m4c| wed| 4pj| bsi| nx3| bzi| k3t| tuk| 3cf| yo3| fyp| f3m| tgk| 4vd| oh4| zmo| m2u| r2u| elu| 2bj| sb2| gdd| e3d| blo| k3w| slm| 3md| ib3| hai| t1u| t1i| act| 2ss| hf2| mzs|