2011-11-04 8 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

BTW - 配列が参照渡しされているとは言い難いと思いますが(あなたの意図を理解しています)より正確に言えば、配列参照は値渡しです。ありがとう! – user247866

+1

他のスレッドが読んでいるときにそれを同時に変更するかもしれないからです。 –

0

はい、それはあなたがこの方法だけがそれを読み込むよう別のスレッドが配列に同じ時間を更新している場合は、唯一可能なトラブルが

+4

もう1つのスレッドは、同時にアレイの項目を編集することができます。 – BalusC

+0

はい、これも私が意味するものです –

+1

最初はあなたの答えになかったので、5分の猶予期間のあとですぐ編集しました。 – BalusC

1

メソッド自体は、他のスレッドにパブリッシュすることなく引数を取り、読み込むため、スレッドセーフです。しかし、それはあなたがスレッドの問題を抱えていないことを意味するわけではありません。それはすべて引数がどこから来るかによって異なります。

引数がスレッド間で共有状態を構成する場合、この状態へのアクセスは何らかの形で同期する必要があります。しかし、この状態へのアクセスを保護するには、スレッド間に同期ポリシーを確立する必要があります。したがって、このメソッドまたはこのメソッドの呼び出し元は、状態へのアクセスがスレッドセーフであることを確認する必要があります。引数がどこから来たのかわからなければ、このコードがスレッドセーフであるかどうかを知ることは不可能です。

関連する問題