java线程: Unusual behaviour of threads

标签 java multithreading

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

相关文章:

java - Eclipse 中的代码清理 - 如何在非 javadoc 注释中保留空行?

C-具有多线程的互斥数据结构

python - 每次迭代在多个 CPU 上训练不同的 scikit-learn 分类器

linux - SGE 低优先级单核作业阻止多核作业

java - 为什么 System.out.println 的输出与 bufferedwriter 不同?

java - 如何将我的意思是将 reducer 输出(整个MR输出)压缩到一个 zipper 中?而不是像 “part0000.txt ”的 “part0000.zip”

在Android中,当OP_WRITE存在时,Java nio OP_READ不执行?

c - 如何制作一个用户输入大小的全局数组?

java - DB2 中使用 INTERSECT 的交集

java - 在java中复制一个二维数组