Java多線程——volatile關鍵字、發佈和逸出

一、volatile關鍵字  數組

Java語言提供了一種稍弱的同步機制,即volatile變量。被volatile關鍵字修飾的變量不會被緩存在寄存器或者對其餘處理器不可見的地方,所以在每次讀取volatitle類型變量時總會返回最新的值,而不是從寄存器中獲取。緩存

  加鎖機制既然能夠確保可見性又能夠確保原子性,而volatile只能確保可見性。安全

二、發佈和逸出ide

  發佈(Publish)」一個對象指,使對象可以在當前做用域以外的代碼中使用。如將指向該對象的引用保存到其餘代碼能夠訪問的地方,或者在某一個非私有的方法中返回該引用,或者將引用傳遞到其餘類的方法中。函數

  當某個不應發佈的對象被髮布時,這種狀況稱爲逸出(Escape).好比下面的代碼:this

 1 public class UnsafeStates {
 2     private String[] states = new String[]{
 3             "one",
 4             "two"
 5     };
 6 
 7     public String[] getStates() {
 8         return states;
 9     }
10 
11     public void setStates(String[] states) {
12         this.states = states;
13     }
14     
15 }
View Code

  若是按照上面的方法發佈states,就會出現問題,由於任何調用者都能修改這個數組的內容。數組states已經逸出它所在的做用域,由於這個本是私有的變量已經被髮布了。spa

三、安全對象的構造過程.net

  不要在構造函數中使this引用逸出code

  下面的一位大神寫的案列寫的很是清楚:對象

  http://blog.csdn.net/flysqrlboy/article/details/10607295。

  主要演示了由內部類致使的this引用逸出是怎樣產生的。它須要知足兩個條件:一個是在構造函數中建立內部類(EventListener),另外一個是在構造函數中就把這個內部類給發佈了出去(source.registerListener)。所以,咱們要防止這一類this引用逸出的方法就是避免讓這兩個條件同時出現。也就是說,若是要在構造函數中建立內部類,那麼就不能在構造函數中把他發佈了,應該在構造函數外發布,即等構造函數執行完畢,初始化工做已所有完成,再發布內部類。

相關文章
相關標籤/搜索