JVM如何确保只有一个线程可以获取对象的锁?

我们大多数人都知道,每当线程访问对象的同步块时,JVM就会将该对象的锁定提供给线程。 JVM如何确保只有一个线程可以访问对象的锁?

JVM使用操作系统提供的某些锁定function,如信号量对象。 所以问题现在变成了操作系统如何做到这一点。

通常有这些东西的硬件支持。 CPU可以提供比较和设置指令,该指令在执行时设置CPU的引脚(在多CPU架构中有用)或CPU的内部线路(用于单CPU多核架构),它告诉其他硬件当前在地址总线上形成的存储器位置不会被其他任何人改变。 因此,硬件架构保证了该指令的primefaces性。

一旦你有一个保证primefaces比较和设置指令,其余的相对容易:锁对象有一个标志; 希望获取锁的线程对该标志执行比较和设置指令,值为1; 如果比较的结果为真,那么该值已经是1,所以其他一些线程已经有了锁。 如果结果为false,则该值不是1,因此当前线程可能认为自己现在是锁的所有者。

如果操作系统无法代表线程获取锁,则它将线程置于“等待锁定”状态,其中线程将保持直到锁被释放。

JVM使用Monitor模式实现此目的。

http://en.wikipedia.org/wiki/Monitor_(synchronization)