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

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

解决方法:

JVM使用操作系统提供的某些锁定功能,例如信号量对象.因此,现在的问题变成了操作系统如何实现.

通常,这些东西都有硬件支持. CPU可以提供比较设置指令,该指令在执行时设置CPU的引脚(在多CPU架构中有用)或CPU的内部线(对于单CPU多核架构),该指令告诉其他硬件:当前在地址总线上形成的存储位​​置不得由任何其他人更改.因此,硬件体系结构保证了该指令的原子性.

一旦有了保证原子的比较和设置指令,其余的操作就相对容易了:锁对象有一个标志;希望获取锁的线程在该标志上执行比较置位指令,值为1;如果比较结果为true,则该值已经为1,因此其他某个线程已经具有该锁.如果结果为假,则该值不为1,因此当前线程现在可以认为自己是锁的所有者.

如果操作系统无法代表线程获取锁,则它将线程置于“等待锁”状态,在该状态下线程将一直停留到释放锁为止.

上一篇:c# – 检查列表Count属性时出现多线程问题


下一篇:innodb的Mysql low_priority:选择应该在死锁中回滚哪个查询