gpt4 book ai didi

java线程: Unusual behaviour of threads

转载 作者:行者123 更新时间:2023-12-02 07:09:39 27 4
gpt4 key购买 nike

我正在尝试使用两个线程的代码,一个线程递增共享长变量,另一个线程递减 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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com