結果が400 000ではないのだろうかと疑問に思っています。なぜ2つのスレッドがブロックされるのですか?Javaスレッドの問題?
class IntCell {
private int n = 0;
public int getN() {return n;}
public void setN(int n) {this.n = n;}
}
class Count extends Thread {
private static IntCell n = new IntCell();
@Override public void run() {
int temp;
for (int i = 0; i < 200000; i++) {
temp = n.getN();
n.setN(temp + 1);
}
}
public static void main(String[] args) {
Count p = new Count();
Count q = new Count();
p.start();
q.start();
try { p.join(); q.join(); }
catch (InterruptedException e) { }
System.out.println("The value of n is " + n.getN());
}
}
なぜそれに問題がありますか?あなたは、変数をインクリメントする方法はアトミック操作ではありませんので
「なぜブロックされますか」とはどういう意味ですか?何が問題なのか - 両方のスレッドが特定の値(たとえば100)をフェッチし、両方ともインクリメント(101に)してから値を格納するとします。 2つの増分が発生しましたが、結果は102の代わりに101になります。 –
結果を追加したい場合があります。 FYI:これはスレッド化と値の同時更新で理解する必要がある基本的なことです。 –
私はあなたに行くとマルチスレッドの仕組みを読むことをお勧めします。あなたの質問は深刻な誤解を意味します。マルチスレッドは非常に難しいので、始める前に理解しておく必要があります。 – davmac