哪个线程会锁定?

Fer*_*deh 5 java concurrency multithreading synchronization

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

谢谢

aio*_*obe 9

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

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

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

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

  • 我也不认为在那个级别会有"同时".一个线程将获得锁定,只是先到达那里.不需要投掷硬币. (2认同)

IlD*_*Dan 2

关键是不存在“同时”这样的事情。两者之一将获得锁,但你无法知道是哪一个。

不存在“同时”这样的事情,因为从广义上讲,锁是一次独占地选择和执行一个线程的东西。

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

  • @Feras,aioobe:即使在多处理器系统中,也有一些操作无法同时执行(请参阅http://en.wikipedia.org/wiki/Atomic_(computer_science)#Primitive_atomic_instructions),并且 sychrnonized 的任何实现都必须使用这样的操作可以保证没有两个线程同时进入锁。 (4认同)