synchronized实现原理
Synchronized是由一对
monitorenter/monitorexit指令实现的,
monitor是对象同步实现的基本单元,在java 6之前,monitor的实现完全依靠操作系统内部的互斥锁实现的,因为需要进行用户态到内核态的转换,所以同步操作是一个无差别的重量级的操作,性能也很低,但在java 6 的时候,java虚拟机对此进行了,大刀阔斧的改进,提供了三种不同的monitor的实现,也就是常说的三种不同的锁,:偏向锁,轻量锁,重量锁,大大改进其性能
多线程中锁升级的原理
synchronized锁升级的原理:
在锁对象的对象头里面有一个threadid字段,在第一次访问的时候threadid为空,jvm让其持有偏向锁,并将threadid设置为其线程id,再次进入时会先判断threadid是否与其线程id一致,如果一致则直接使用此对象,如果不一致,则升级偏向锁为轻量级锁,通过自旋循环一定次数来获取锁,执行到一定次数之后,如果还没有正常获取到锁,此时就会把轻量级锁升级为重量级锁,此过程就构成了synchronized锁的升级的原理
什么是死锁
当线程A持有独占锁a,并尝试去获取独占锁b的同时,线程B持有独占锁b,并尝试获取独占锁a的情况下,就会发生AB两个线程由于互相持有对方需要的锁,而发生的阻塞现象,我们称之为死锁