【java安全執行緒及不可變性】

來源:互聯網
上載者:User

標籤:

原文連結

 Jakob Jenkov 譯者:高嵩 校對:丁一

在java中當多個線程同時訪問同一個資源,並且其中的一個或者多個線程對這個資源進行了寫操作,才會產生競態條件。多個線程同時讀同一個資源不會產生競態條件。

我們可以通過建立不可變的共用對象來保證對象線上程間共用時不會被修改,從而實現安全執行緒。如下樣本:

  1. public class ImmutableValue{
  •     private int value = 0;
  •     public ImmutableValue(int value){
  •         this.value = value;
  •     }
  •     public int getValue(){
  •         return this.value;
  •     }
  • }

複製代碼

請注意ImmutableValue類的成員變數value是通過建構函式賦值的,並且在類中沒有set方法。這意味著一旦ImmutableValue執行個體被建立,value變數就不能再被修改,這就是不可變性。但你可以通過getValue()方法讀取這個變數的值。

譯者註:注意,“不變”(Immutable)和“唯讀”(Read Only)是不同的。當一個變數是“唯讀”時,變數的值不能直接改變,但是可以在其它變數發生改變的時候發生改變。比如,一個人的出生年月日是“不變”屬性,而一個人的年齡便是“唯讀”屬性,但是不是“不變”屬性。隨著時間的變化,一個人的年齡會隨之發生變化,而一個人的出生年月日則不會變化。這就是“不變”和“唯讀”的區別。(摘自《Java與模式》第34章)

如果你需要對ImmutableValue類的執行個體進行操作,可以通過得到value變數後建立一個新的執行個體來實現,下面是一個對value變數進行加法操作的樣本:

  1. public class ImmutableValue{
  •     private int value = 0;
  •     public ImmutableValue(int value){
  •         this.value = value;
  •     }
  •     public int getValue(){
  •         return this.value;
  •     }
  •     public ImmutableValue add(int valueToAdd){
  •         return new ImmutableValue(this.value + valueToAdd);
  •     }
  • }

複製代碼

請注意add()方法以加法操作的結果作為一個新的ImmutableValue類執行個體返回,而不是直接對它自己的value變數進行操作。

引用不是安全執行緒的!

重要的是要記住,即使一個對象是安全執行緒的不可變對象,指向這個對象的引用也可能不是安全執行緒的。看這個例子:

  1. public void Calculator{
  •     private ImmutableValue currentValue = null;
  •     public ImmutableValue getValue(){
  •         return currentValue;
  •     }
  •     public void setValue(ImmutableValue newValue){
  •         this.currentValue = newValue;
  •     }
  •     public void add(int newValue){
  •         this.currentValue = this.currentValue.add(newValue);
  •     }
  • }

複製代碼

Calculator類持有一個指向ImmutableValue執行個體的引用。注意,通過setValue()方法和add()方法可能會改變這個引用。因此,即使Calculator類內部使用了一個不可變對象,但Calculator類本身還是可變的,因此Calculator類不是安全執行緒的。換句話說:ImmutableValue類是安全執行緒的,但使用它的類不是。當嘗試通過不可變性去獲得安全執行緒時,這點是需要牢記的。

要使Calculator類實現安全執行緒,將getValue()、setValue()和add()方法都聲明為同步方法即可。

【java安全執行緒及不可變性】

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.