私は2つのスレッドでコードを試していました.1つのスレッドは共有された長い変数をインクリメントし、もう1つのスレッドは変数をデクリメントします.
class Shared {
private long a;
public void incr() {
a++;
}
public void dec() { a--; }
public long getA(){return a;}
}
この共有オブジェクトを 2 つのスレッドに渡しています。各スレッドでインクリメントまたはデクリメントする Nitems の回数
Shared obj = new Shared();
Incrementer incrementer = new Incrementer(obj, nitems);
Decrementer decrementer = new Decrementer(obj , nitems);
減分スレッドの実行方法:-
public void run()
{
for(int i=0; i<nitems; ++i)
{
s.dec();
}
}
インクリメント スレッドの実行方法:-
public void run()
{
for(int i=0; i<nitems; ++i)
{
s.incr();
}
}
私がそれを実行すると。私は問題をはっきりと見ることができました。コード全体を 20 回実行した後、結果はゼロではありません。このように変更すると、同じ実行方法になります
//increment
public void run()
{
for(int i=0; i<nitems; ++i)
{
s.incr();
System.out.println("ghijk");
}
}
//decrement
public void run()
{
for(int i=0; i<nitems; ++i)
{
s.dec();
System.out.println("abcdef");
}
}
値がゼロでなかった 1 ~ 2 回を除いて、結果はほぼ常にゼロです。私の質問は、この SOP が導入されたときに、このコードが適切に機能するようになった理由です??? incr() メソッドと dec() メソッドを同期した後でのみ、出力としてゼロが生成されると思いました。