我正在尝试具有两个线程的代码,一个线程增加一个共享长变量,另一个线程减少 var。
class Shared {
private long a;
public void incr() {
a++;
}
public void dec() { a--; }
public long getA(){return a;}
}
我将此共享对象传递给两个线程。在每个线程中增加或减少的 Nitems 次数
Shared obj = new Shared();
Incrementer incrementer = new Incrementer(obj, nitems);
Decrementer decrementer = new Decrementer(obj , nitems);
递减线程的run方法:-
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");
}
}
结果几乎一直为零,除了一两次值不为零的情况。我的问题是什么时候引入这个 SOP 是什么让这个代码正常工作???我认为只有在同步 incr() 和 dec() 方法之后才会产生零作为输出。