标签:null reference stat 说明 添加 代码块 final inf 解锁
Synchronized的四种锁状态:无锁状态,偏向锁,轻量级锁,重量级锁
轻量级锁的使用场景:如果一个对象虽然有多线程访问,但多线程访问的时间是错开的,也就是说没有竞争,那么完全可以用轻量级锁来优化
假设有两个方法同步块,利用同一个对象加锁
static final Object obj = new Object(); public static void method1(){ synchronized(obj){ //同步块A method2(); } } public static void method2(){ synchronized(obj){ //同步块B } }
给一个对象(obj)加锁,会在操作系统层面获取一个监视器(Monitor,有时候也叫管程)对象,对象obj的Markword会指向该Monitor对象,原本Markword中存放的分代年龄等信息会存放在Monitor对象里。Monitor里的Owner指向持有该对象obj的锁的线程Thread_1。当其它线程Thread_2, Thread_3试图获取对象obj的锁时,发现Owner已经指向了Thread_1,也就是Thread_1已经获取该对象的锁时后,那么Monitor的EntryList就会将Thread_2,Thread_3放到EntryList里面,等到Thread_1释放锁后,再从EntryList里取出一个线程,将Monitor里的Owner指向该进程。每个对象都有自己的Monitor
图中Thread_1释放锁,Thread_2获得obj的锁,
需要注意的是:只有在用synchronized关键字修饰后,才会有上述对象markword指向Monitor,否则的话,是不会去向操作系统申请这一Monitor对象的。而且,必须是重量级锁才会申请这个Monitor
标签:null reference stat 说明 添加 代码块 final inf 解锁
原文地址:https://www.cnblogs.com/Chsy/p/12712625.html