2011-11-04 47 views
8
public static int rank(int key, int[] a) { 
     int lo = 0; 
     int hi = a.length - 1; 
     while (lo <= hi) { 
      // Key is in a[lo..hi] or not present. 
      int mid = lo + (hi - lo)/2; 
      if  (key < a[mid]) hi = mid - 1; 
      else if (key > a[mid]) lo = mid + 1; 
      else return mid; 
     } 
     return -1; 
    } 

上面的靜態方法可以進行二分查找。線程安全嗎?我知道局部變量是線程安全的,但這裏的「a」是一個數組,所以這意味着它是Java中的對象,對吧?那是問題嗎? 數組剛剛被讀取,沒有以任何方式修改,所以我假設這個方法是線程安全的。但我想確保我明白爲什麼。靜態方法中的Java數組是否安全?

謝謝!

回答

7

沒有數組不是通常是線程安全的。在這種情況下,代碼是否取決於其他線程是否可以訪問您傳入的數組。因爲數組是通過引用傳遞的,所以其他線程可以訪問它們。

如果您只在單個線程中創建/修改數組,或者如果您傳入以線程安全方式複製的副本,那就沒問題。

+0

我明白了。所以即使數組沒有被修改,代碼也不是線程安全的,對吧?但只要每個調用此方法的線程都使用不同的數組對象,生活就會很好。 – user247866

+4

順便說一句 - 我不認爲這是正確的說數組通過引用傳遞(但我明白你的意思)。更準確地說,數組引用是按值傳遞的。謝謝! – user247866

+1

僅僅因爲其他線程可能會在您讀取它的同時對其進行修改。 –

0

是的,它是線程安全的,你說你只讀數組,唯一可能的故障可能如果另一個線程正在更新數組的同時,這種方法讀取它

+4

另一個線程仍然可以在同一時刻編輯數組的一個項目。 – BalusC

+0

是的,這也是我的意思 –

+1

最初不是在你的答案中,你稍後在5分鐘的寬限期內編輯它。 – BalusC

1

該方法本身是線程安全的,因爲它只接受它的參數並讀取它們,而不會將它們發佈到任何其他線程。但這並不意味着你不能有線程問題。這一切都取決於爭論的來源。

如果參數構成線程之間的共享狀態,那麼應該以某種方式同步對這個狀態的每次訪問。但是你必須在線程之間建立一個同步策略來保護對這個狀態的訪問。因此,此方法或此方法的調用者應確保對狀態的訪問是線程安全的。不知道參數來自哪裏,因此不可能知道這些代碼是否是線程安全的。