方法同步问题。JAVA
我试图理解Java中的多线程,遇到了以下问题: 我创建了20个线程,每个线程执行一个简单的递增操作并获得一些值。请查看下面的代码摘录:方法同步问题。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().
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());
}