java - java中同步输出不正确

标签 java synchronization synchronized

代码中,线程输出未正确同步。输出应该是按升序排列的数字。

这是代码

public class Prog {

    public static void main(String[] args) {
        Thread a = new Thread(new Writer(), "A");
        Thread b = new Thread(new Writer(), "B");
        Thread c = new Thread(new Writer(), "C");
        a.start();
        b.start();
        c.start();
    }

    static class Writer implements Runnable {

        private static int count;

        @Override
        public void run() {
            while (count < 5) {
                show();
            }
            try {
                Thread.sleep(200);
            } catch (InterruptedException ex) {
            }
        }

        private synchronized void show() {
            System.out.println(Thread.currentThread().getName() + ":\t" + ++count);
        }
    }
}
<小时/>

此代码的一个输出是:

B:  2
B:  4
C:  3
A:  2
B:  5
<小时/>

而预期输出是:

B:  1
B:  2
C:  3
A:  4
B:  5
<小时/>

我错过了什么?请帮忙。

最佳答案

每个 Writer 都会(隐式)自身同步 - 因此您拥有三个 writer 和三个独立的锁(它们之间不会发生真正的同步)。

如果将 show 方法更改为静态,则编写器将在 Writer 类上同步 - 这样所有编写器将共享锁并与每个编写器同步其他。

关于java - java中同步输出不正确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41459103/

相关文章:

java - 在一个线程添加项目而一个线程删除项目时同步最大值

Android Studio Gradle 读取 ZIP 文件时出错

java - Applinx API 中的 GXWaitForCursor 总是因超时而失败

java - 相当于 conserve String 的环境变量

用于从查询字符串中删除参数的 Java 正则表达式模式

java - 两个队列和不同的线程

java - 在线程之间共享数据 - 原子引用或同步

java - 这个例子中有竞争条件吗?如果是这样,如何避免?

java - 为什么我的同步方法不能正常工作?

java - 以千字节为单位比较 java-app 和 c-app