Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.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 - Fatal编程技术网

Java 为什么我的多线程执行是单线程模式

Java 为什么我的多线程执行是单线程模式,java,multithreading,Java,Multithreading,您应该阅读Java中的并发性,特别是关键字的含义 现在,来看看你的代码是怎么回事 当一个线程(例如id为12的线程)调用write2()方法时,它会获得对象上的锁(互斥锁)。然后在方法体中执行代码(即循环和打印语句)。最后,它释放对象上的锁,以允许另一个线程等待执行该方法。因此,您总是可以看到打印语句以两个段的形式出现。write2中的synchronized修饰符允许该方法一次只能由一个线程运行-您需要删除它才能同时在多个线程上运行 如果您真正想要做的是锁定共享变量,请使用synchroniz

您应该阅读Java中的并发性,特别是关键字的含义

现在,来看看你的代码是怎么回事


当一个线程(例如id为12的线程)调用
write2()
方法时,它会获得对象上的锁(互斥锁)。然后在方法体中执行代码(即循环和打印语句)。最后,它释放对象上的锁,以允许另一个线程等待执行该方法。因此,您总是可以看到打印语句以两个段的形式出现。

write2中的synchronized修饰符允许该方法一次只能由一个线程运行-您需要删除它才能同时在多个线程上运行

如果您真正想要做的是锁定共享变量,请使用
synchronized
块:

write,12,1
write,12,2
write,15,3
write,15,4
write,16,5
write,16,6
write,14,7
write,14,8
write,13,9
write,13,10

public synchronized static void write2()
是一种静态同步方法,意味着锁/监视器在
Class
级别而不是
Object
级别进行维护

静态同步方法在
Class
对象上进行
synchronized
。如果一个线程正在执行
静态同步
方法,则尝试执行任何
静态同步
方法的所有其他线程都将被阻止,除非锁定线程释放锁

非静态同步方法在此上同步(表示对象,它是类的实例)。如果一个线程正在执行一个
synchronized
方法,那么试图在该对象(而不是类)上执行任何
synchronized
方法的所有其他线程都将被阻止

查看相关SE问题:

您可以在这里找到有关概念的良好文档

您可能想知道调用静态同步方法时会发生什么,因为静态方法与类而不是对象相关联。在这种情况下,线程获取与类关联的类对象的内在锁。因此,对类的静态字段的访问由一个锁控制,该锁不同于类的任何实例的锁


您是否了解同步的功能?您能否详细说明问题所在?Edit:将方法标记为synchronized将基本上确保从不同线程执行该方法不会重叠。如果在另一个线程仍在执行时从一个线程发出调用,那么第二个线程将等待第一个线程完成执行。此外,您可以从输出中看到,由于线程的执行顺序不正确,所以事情是同时发生的。
write,12,1
write,12,2
write,15,3
write,15,4
write,16,5
write,16,6
write,14,7
write,14,8
write,13,9
write,13,10
synchronized(shared){
  shared++;
  System.out.println("write," + Thread.currentThread().getId() + "," + String.valueOf(shared));
}