【发布时间】:2015-11-19 10:17:05
【问题描述】:
我正在尝试理解 Java 中的多线程,但遇到了以下问题: 我创建了 20 个线程,每个线程执行一个简单的递增操作并获取一些值。请在下面找到代码摘录:
public class MyClass {
public static void main(String[] args) {
for (int i = 0 ; i < 20 ; i ++) {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + " == " + MyClass1.incAndGet());
}).start();
}
}
private static class MyClass1 {
static private int s;
private static synchronized int incAndGet(){
return s ++;
}
}
}
这里对incAndGet方法的访问是同步的,因此没有线程可以在不一致的线程中找到s变量的状态。我无法理解的是为什么输出如下:
Thread-0 == 2
Thread-11 == 10
Thread-14 == 12
Thread-15 == 9
Thread-18 == 14
Thread-13 == 8
....
不应该是这样的:
Thread-0 == 0
Thread-11 == 11
Thread-14 == 14
Thread-15 == 15
Thread-18 == 18
Thread-13 == 13
....
如果我误解了同步的概念,请您提供同步的好和坏的例子。谢谢。
【问题讨论】:
标签: java multithreading synchronization