我需要增加 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/