Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
方法同步问题。JAVA_Java_Multithreading_Synchronization - Fatal编程技术网

方法同步问题。JAVA

方法同步问题。JAVA,java,multithreading,synchronization,Java,Multithreading,Synchronization,我试图理解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().

我试图理解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 ++;
  }

 }
}
难道不应该是这样的:

Thread-0 == 0
Thread-11 == 11
Thread-14 == 14
Thread-15 == 15
Thread-18 == 18
Thread-13 == 13
....

如果我误解了同步的概念,请您提供好同步和坏同步的示例。谢谢。

在线程作业中,通常有两种基本操作:
incadedget()
System.out.println()
。此操作的顺序也不是顺序的:这样的
Thread-13
可以执行
incadedget
,然后
Thread-18
将执行
incadedget
,然后
Thread-18
将执行
System.out.println()
之前的
Thread-13
。因此,如果您想要连续打印输出,您应该将
incadedget
println
同步:

  synchronized (MyClass.class) {
                    System.out.println(Thread.currentThread().getName() + " == " + MyClass1.incAndGet());
                }

不能保证线程将按顺序执行。
在不同的运行中,它将显示不同的输出。

这些数字不匹配,因为调度程序以与创建线程不同的顺序运行线程。线程名称在创建时确定,而编号
s
在线程实际运行时计算。

这不会阻止线程以不同于启动顺序的顺序打印。
  synchronized (MyClass.class) {
                    System.out.println(Thread.currentThread().getName() + " == " + MyClass1.incAndGet());
                }