【问题标题】:improper output of synchronization in javajava中同步输出不正确
【发布时间】:2017-01-04 08:14:55
【问题描述】:

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

这里是代码

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

我错过了什么?请帮忙。

【问题讨论】:

    标签: java synchronization synchronized


    【解决方案1】:

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

    如果您将show 方法更改为静态,写入器将改为在Writer 类上同步 - 这样所有写入器将共享锁并相互同步。

    【讨论】:

    • 您大致了解 Java 同步的工作原理吗?我不知道哪些部分需要更深入的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-26
    • 2010-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多