我试图理解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
....如果我误解了同步的概念,你能提供好的和不好的同步的例子吗?谢谢。
发布于 2015-11-19 18:22:19
在线程作业中,通常有两个基本操作:incAndGet()和System.out.println()。这些操作的顺序也不是连续的:这样的Thread-13可以执行incAndGet,然后Thread-18将执行incAndGet,然后Thread-18将在Thread-13之前执行System.out.println()。因此,如果您想要连续打印输出,则应该将incAndGet与println同步
synchronized (MyClass.class) {
System.out.println(Thread.currentThread().getName() + " == " + MyClass1.incAndGet());
}发布于 2015-11-19 18:23:09
不能保证Thread将以顺序方式执行。在不同的运行中,它会显示不同的输出。
发布于 2015-11-19 18:24:14
这些数字不匹配,因为调度程序运行线程的顺序与创建线程的顺序不同。线程名称是在创建时决定的,而数量s是在线程实际运行时计算的。
https://stackoverflow.com/questions/33800980
复制相似问题