synchronized底层原理

jvm class字节码分析

当synchronized关键字作用于方法上的时候

jvm的class字节码访问标志显示的就是sync

synchronized底层原理_第1张图片

当synchronized作用于代码块的时候 字节码会显示监视器monitor锁

monitorenter加锁

monitorexit 解锁

也就是说synchronized是一个隐式锁,内部使用的是jvm的监视器锁

不需要我们手动加锁和解锁,有monitor监视器来帮我们完成

当代码执行完毕自动释放锁

synchronized底层原理_第2张图片 

总结


1.当线程执行到同步代码块的时候,首先需要获取对象的monitor对象
2.如果monitor对象的锁计数为0,表示monitor对象没有被占用,该锁可以获得锁
将锁计数器为1,并将锁的持有者id,设置为当前线程的id
3.如果monitor对象的锁计数器不为0 并且当前线程id,等于锁的持有者id ,则直接返回,表示该线程已经获取到锁
4.如果monitor对象的锁计数器不为0 并且当前线程id,不等于锁的持有者id,则将该线程加入到monitor对象的等待队列中,并进入阻塞状态
5.直到monitor对象的锁计数为0的时候,从等待队列中唤醒其中一个线程,并将其从等待队列移到同步队列中,唤醒的线程继续第1步的流程
6.当线程退出同步代码块或者发生异常的时候,该线程会释放锁,将锁的计数器减1,并清空锁的持有者id,
如果同步队列中有线程等待,则从同步队列中按照先进先出的顺序唤醒一个线程,接着该线程开始执行同步代码块

你可能感兴趣的:(多线程,java,java,jvm,开发语言,多线程)