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

时间:2015-02-05 12:45:14

标签: java multithreading locking

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

2 个答案:

答案 0 :(得分:3)

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

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

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

如果操作系统无法代表某个线程获取锁定,那么它会将该线程置于“等待锁定”状态,在该状态下,该线程将一直保持到锁被释放为止。

答案 1 :(得分:1)

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

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