哪个线程会锁定?

时间:2010-10-17 10:17:32

标签: java multithreading concurrency synchronization

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

由于

2 个答案:

答案 0 :(得分:9)

行为将是非确定性(也就是说,任一个线程都可能获得锁定),并且它可能因执行而异。这是因为它取决于特定的JVM实现以及线程的特定调度。

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

  

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

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

答案 1 :(得分:2)

关键是没有“同时”这样的事情。其中一个将获得锁定,但你无法知道哪一个。

没有“同时出现”这样的事情,因为从口头上讲,锁是某种,它一次只选择并执行一个线程。

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