java - 这段代码中是否存在竞争条件?

标签 java multithreading thread-safety synchronized

我需要增加 5 个线程中的计数器,直到达到 500。像这样的 5 个线程正在工作。但我需要知道它是否有竞争条件。

此代码的另一个问题是它以错误的顺序提供打印结果。

class HiloContador extends Thread {

    static int count = 0;

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (new Integer(count)) {
                ++count;
                System.out.println(count);
            }
        }
    }
}

输出

4 6 8 9 10 11 12 5 14 15 3 17 18

一些想法?

最佳答案

是的,存在竞争条件,因为您实际上同步了不同对象上的代码。 同步块(synchronized block)代表临界区。要进入关键部分,您必须获得全局锁。您可以使用对象来锁定或使用整数。 这就是我的实现方式:

class HiloContador extends Thread {

    static int count = 0;
    static Object lock = new Object();

    @Override
    public void run() {
        for (int i = 0; i < 100; i++) {
            synchronized (lock) {
                ++count;
                System.out.println(count);
            }
        }
    }
}

现在 println 将按预期顺序排列。

关于java - 这段代码中是否存在竞争条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47413738/

相关文章:

c# - 为什么这个消费者-生产者线程被卡住了?

java - 当一个单独的线程正在 hibernate 时关闭 java 应用程序是否不好?

java - Android Manifest 文件定制

c# - 关于 Java 和 C# 中的多维数组的问题?

java - RxJava - 何时将 Observable 与创建方法一起使用

multithreading - Lucene如何在多线程环境下使用IndexReader?

java - 使用两个线程一次打印一个字母和数字

java - 值未传递给 Controller

java - 从 edittext 获取数值的另一种方法

java - 在 Java 中递增信号量许可