java中不正确的同步输出

2q5ifsrm  于 2021-07-09  发布在  Java
关注(0)|答案(1)|浏览(493)

在代码中,线程输出没有正确同步。输出应该是按递增顺序排列的数字。
这是密码

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

我错过了什么?请帮忙。

ttvkxqim

ttvkxqim1#

每个 Writer 同步(隐式地)在自身上-因此您有三个写入程序和三个单独的锁(它们之间不可能发生真正的同步)。
如果你改变主意 show 方法,写入程序将在 Writer 类-这样所有编写器都将共享锁并相互同步。

相关问题