あるスレッドが配列の1つのインデックスから読み取るときに並行性の問題がありますか?インデックスが異なる限り、別のスレッドが配列の別のインデックスに書き込みますか?java配列のスレッドセーフ
class Test1
{
static final private int N = 4096;
final private int[] x = new int[N];
final private AtomicInteger nwritten = new AtomicInteger(0);
// invariant:
// all values x[i] where 0 <= i < nwritten.get() are immutable
// read() is not synchronized since we want it to be fast
int read(int index) {
if (index >= nwritten.get())
throw new IllegalArgumentException();
return x[index];
}
// write() is synchronized to handle multiple writers
// (using compare-and-set techniques to avoid blocking algorithms
// is nontrivial)
synchronized void write(int x_i) {
int index = nwriting.get();
if (index >= N)
throw SomeExceptionThatIndicatesArrayIsFull();
x[index] = x_i;
// from this point forward, x[index] is fixed in stone
nwriting.set(index+1);
}
}
編集(この例では、必ずしも唯一の私のポイントを説明するために、実際の使用はお勧めしません):この例を批判は私の質問はありませんが、私は文字通り、同時にに、一つの指標にあれば配列アクセスを知りたいです他の索引へのアクセスは、並行性の問題を引き起こし、単純な例を考えることができませんでした。
ありがとう... drat、私はバイト[]配列を使いたいと思います。 ....私はちょうど同期メソッドを使用し、それを簡単に保つと思います。 –
書き込みよりも読み込み量が多い場合は、java.util.concurrent.locks.ReadWriteLockを参照してください。 –
興味深い... –