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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/google-chrome/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_Concurrency_Synchronization - Fatal编程技术网

Java 哪根线会得到锁?

Java 哪根线会得到锁?,java,multithreading,concurrency,synchronization,Java,Multithreading,Concurrency,Synchronization,假设我们有多处理器机器和多线程应用程序。如果两个线程可以访问一个同步的方法,并且它们同时被执行,那么哪个线程将获得锁? 或者会发生什么 感谢该行为将是非确定性的(即,任何一个线程都可能获得锁),并且在不同的执行中可能会有所不同。这是因为它取决于特定的JVM实现,以及线程的特定调度 根据本文,JVM规范对公平性没有任何限制: 公平性 Java内存模型没有为线程或抢占式多线程指定任何公平性要求。一个线程可以拒绝将CPU交给另一个线程,从而使系统陷入死锁。对其他线程的公平性规则由各个JVM实现定义 也

假设我们有多处理器机器和多线程应用程序。如果两个线程可以访问一个同步的方法,并且它们同时被执行,那么哪个线程将获得锁? 或者会发生什么


感谢

该行为将是非确定性的(即,任何一个线程都可能获得锁),并且在不同的执行中可能会有所不同。这是因为它取决于特定的JVM实现,以及线程的特定调度

根据本文,JVM规范对公平性没有任何限制:

公平性
Java内存模型没有为线程或抢占式多线程指定任何公平性要求。一个线程可以拒绝将CPU交给另一个线程,从而使系统陷入死锁。对其他线程的公平性规则由各个JVM实现定义


也就是说,除非你仔细地同步你的程序,否则一个线程理论上可能会被调度程序饿死。

关键是不存在“同时”这样的事情。两个人中的一个会得到锁,但你无法知道是哪一个

不存在“同时”这样的事情,因为坦率地说,锁是一种选择线程并一次只执行一个线程的东西


这自然是在一个一次可以执行一条指令的纯单处理器系统中实现的。在多处理器系统上,通常会有一些硬件设备“锁定”处理器,以防止它们同时执行。

我猜,虚拟机将不得不掷硬币。这是否意味着如果两个线程都试图在一个循环中获取锁,虚拟机可以饿死一个线程?@Peter G,是的,看看我的答案。@Peter G:按照规范它可以。但是一个聪明的实现会有一些解决方法(比如近似的到达顺序)。我也不认为在这个级别上会有任何“同时”。一个线程将获得锁,只是因为它先到达那里。不需要掷硬币。为什么不可以是“同时”呢。我们说的是多处理器硬件……但管理锁的代码必须以某种方式序列化。@Feras,aioobe:即使在多处理器系统中,也有不能并发执行的操作(请参阅)任何sychrnonized的实现都必须使用这样的操作,以确保没有两个线程同时进入锁。是的,当然,这就是锁的要点。我(我也怀疑Feras)在询问两个线程同时请求锁的情况。这肯定是可能的。。。。。。但是请求该锁的一部分是执行原子指令,而该部分不能“同时”执行。