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配列はスレッドセーフですか?
ありがとうございます!
私は参照してください。したがって、配列は変更されていませんが、コードはスレッドセーフではありません。しかし、このメソッドを呼び出す各スレッドが異なる配列オブジェクトでそれを行う限り、人生は良いです。 – user247866
BTW - 配列が参照渡しされているとは言い難いと思いますが(あなたの意図を理解しています)より正確に言えば、配列参照は値渡しです。ありがとう! – user247866
他のスレッドが読んでいるときにそれを同時に変更するかもしれないからです。 –