【发布时间】:2017-11-21 12:59:02
【问题描述】:
我需要在 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 (new Integer(count)) {完全是垃圾。我不知道你是怎么想出这个主意的,但这绝对是错误的。在很多方面也是如此。 -
也许看看 AtomicInteger
-
但是,如果我将 count 声明为 Integer 并将其用于 de synchronized,则输出仍然错误。
-
如果你得到两次相同的值,输出是错误的,因为竞争条件
-
那是因为
Integer是不可变的,所以你要每次都创建一个新的,而不是synchronize在同一个对象上。就像@Stephan 说的,看看AtomicInteger。
标签: java multithreading thread-safety synchronized