Synchronized【对象锁】采用互斥的方式让同一时间至多只有一个线程持有【对象锁】,其他线程再想获取这个【对象锁】时会阻塞住。
Monitor
字节码信息:java -v xxx.class 查看class字节码信息
monitorenter 上锁【对象锁】
monitorexit 解锁【对象锁】
monitorexit 解锁【对象锁】异常释放
Monitor工作机制
Monitor中文意思是监视器,是由JVM提供,使用C++语言实现
Monitor结构:
- WaitSet
- EntryList
- Owner
Synchronized关键字原理
步骤:
- 当一个线程1执行时,会首先让对象锁这个对象和Monitor关联
- 然后判断Monitor中的Owner属性,锁是否被人获取了,如果没有被人获取,则该线程获取锁
- 当其他线程2执行时,这时对象锁已经被获取,所以其他线程将放入EntryList中等待(BLocked)
- 当线程1释放了对象锁,那么就会唤醒EntryList中的线程,让它们去竞争对象锁
- 当其中的线程调用了wait方法时,就不会放入EntryList中等待了,而是放入WaitSet中