我正在尝试使用两个线程的代码,一个线程递增共享长变量,另一个线程递减 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();
}
}
增量线程的run方法:-
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() 方法之后,才会产生零作为输出。
最佳答案
如果多个线程可以访问某个字段,则需要synchronize它。
关于java线程: Unusual behaviour of threads,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15681859/