《深刻理解Java虛擬機》併發(第12~13章)筆記

volatile關鍵字的做用

  1. 全部變量的可見性——僅僅是修改後的值的可見性,不保證併發修改時新值和預期一致。即只保證讀,不保證寫。
  2. 禁止指令重排序——修飾的變量,讀寫不會指令重排。如變量isReady被volatile修飾,這兩條指令int B = 0isReady=true不會在編譯時改變順序。注意這裏是機器級代碼的重排序。

多線程的實現

JDK基於具體系統來作的,如內核線程、用戶線程、用戶線程加輕量進程混合等。java

不可變

初始化後就不會改變數組

  • final修飾
  • String
  • java.lang.Number的部分子類如Long、Double,AtomicInteger和AtomicLong除外

線程安全

如Vector這樣的容器,雖然get()、size()、add()等有synchronized關鍵字,可是實際使用時仍是須要額外的同步(能夠是針對容器對象自己的synchronized)保障。
緣由是,Vector的線程安全,指的是其對應方法不可打斷。可是在多線程環境下,多個方法按順序執行時,仍有可能產生非預期的行爲。
舉例:對於非空Vector,記爲v,多個線程同時執行remove(v.size()-1),有可能發生數組越界。安全

逃逸分析

(實際是第11章的內容)
運行期優化,判斷一個對象是否會逃逸到方法外或其餘線程。若是不會逃逸,對應的優化手段:多線程

  • 棧上分配,在棧上分配這個對象
  • 同步消除,去掉這個對象多線程下的同步措施
  • 標量替換,將這個對象拆分紅標量(基本數據類型、referrence等)來建立而不是建立這個對象。
相關文章
相關標籤/搜索