複数のスレッドが共有オブジェクトのメソッドを呼び出して、そこに格納されているカウンターをインクリメント/デクリメント/印刷するコードを作成しようとしていました。また、これらの数値が0から8の間で変動することも必要です。つまり、出力は次のようになります。0123234567654566677877666655...。
誰かが私がクランクアウトしたものを見て、私が正しい軌道に乗っているかどうかについていくつかの指針を教えてもらえますか?
私の共有オブジェクト:
public class SyncObj{
private int i;
public synchronized void inc(){
if(i<8)
i++;
}
public synchronized void dec(){
if(i > 0)
i--;
}
public synchronized void print(){
System.out.print(i);
}
}
印刷の枯渇を防ぎ、すべてのinc / decが確実に印刷されるようにするために、hasPrintedというプライベート変数を使用して、クラスを次のように書き直すことができます。
public class SyncObj{
private int i;
//Changed Boolean to boolean as Keith Randall pointed out
private boolean hasPrinted = false;
public synchronized void inc(){
if(i<8 && hasPrinted){
i++;
hasPrinted = false;
}
}
public synchronized void dec(){
if(i > 0 && hasPrinted){
i--;
hasPrinted = false;
}
}
public synchronized void print(){
System.out.print(i);
hasPrinted = true;
}
}
誰かが上記のスニペットを調べて、落とし穴や落とし穴を確認できますか?
ありがとう