次のコードは正しいバランス(100)を表示しないでくださいが、毎回100をプリントアウトしています。何故ですか?次のコードはスレッドセーフではないようです。Javaスレッディングの質問
public class ThreadObject implements Runnable{
private int balance;
public ThreadObject() {
super();
}
public void add() {
int i = balance;
balance = i + 1;
}
public void run() {
for(int i=0;i<50;i++) {
add();
System.out.println("balance is " + balance);
}
}
}
public class ThreadMain {
public static void main(String[] args) {
ThreadObject to1 = new ThreadObject();
Thread t1 = new Thread(to1);
Thread t2 = new Thread(to1);
t1.start();
t2.start();
}
}
次のコードが本当にスレッドセーフであれば、どのように説明できますか?
add()のコードはスレッドセーフではないようです。 1つのスレッドが現在balance
にi
を設定している可能性がありますが、2番目のスレッドが引き継ぎながらbalance
を更新している間は非アクティブになります。その後、スレッド1が目覚めて、balance
を廃止に設定すると、i
と1が加算されます。
は最小値50ですか? 私が考えることができるWORSTのケースは、T1がスリープ状態になるため、T2が引き継ぎ、T1が起き上がり、バランスが更新され、T2が起き上がり、バランスを更新します。 それよりも悪いケースがありますか? – Glide
@グライド:いいえ、ずっと少ないです。 –
私は理解できないようです。あなたは説明できますか? – Glide