これは学校の割り当てですが、私は実際にこの問題を解決する必要があります。私の人生のために、nextValue()
の2つの異なるバージョンが異なって振る舞う理由を理解できません.1つはスレッドセーフで、もう1つは違うのです。誰かが私に正しい方向へのポインタを少なくとも与えることはできますか?スレッドセーフなスレッドと非スレッドセーフなカウンタの実装
た
public class NumGenerator {
static final int MIN_VALUE = -256;
static final int MAX_VALUE = 255;
static final int INITIAL_VALUE = MIN_VALUE -1;
private final AtomicInteger counter = new AtomicInteger(INITIAL_VALUE);
private final AtomicInteger resetCounter = new AtomicInteger(0);
private final Object lock = new Object();
// Thread safe
public int nextValue() {
int next = counter.incrementAndGet();
if (next > MAX_VALUE) {
synchronized (lock) {
next = counter.incrementAndGet();
if (next> MAX_VALUE) {
counter.set(MIN_VALUE);
resetCounter.incrementAndGet();
next = MIN_VALUE;
}
}
}
return next;
}
// Non thread safe
public int nextValue() {
int next = counter.incrementAndGet();
if (next > MAX_VALUE) {
synchronized (lock) {
int i = counter.get();
if (i > MAX_VALUE) {
counter.set(INITIAL_VALUE);
resetCounter.incrementAndGet();
}
next = counter.incrementAndGet();
}
}
return next;
}
}
両方のコードのロジックが異なるようです。 IMHO、両方の関数はスレッドセーフです。しかし、前述のように、両方の関数が期待したものとは異なる出力を返すことがあります。 –
あなたは正しいです、彼らは異なる出力を返します...しかし、なぜですか?私にとっては、彼らは機能的には同じように見えます。私は何が欠けていますか? – BadCash
'counter.get();'と 'counter.incrementAndGet(); 'は違う。だからあなたは別の出力を得るでしょう – iNan