synchronized每隔一段时间都会重新看一次,每次都有新的理解。随着工作经验的累积和代码量的积累,对synchronized的理解也一直在变。
synchronized解决了什么问题?
解决多线程并发访问同一段代码块或方法带来的同步问题。
synchronized的底层原理
每一个对象o在运行时都有一个监视器锁monitor。这个monitor也是一个对象,记录了当前持有对象o的线程,以及其他竞争的线程队列。当多个线程访问synchronized修饰的代码块时,会先执行monitorenter指令,尝试获取monitor。执行完代码块或者异常退出的时候,执行monitorexit指令,让monitor的当前占用线程指针指向null。如果monitor的当前占用线程不为空,则其他竞争资源的线程进入阻塞状态,等待占有线程释放了monitor以后,唤醒其他的等待线程去获取monitor。
monitor的地址指针存在对象o的对象头里,在称之为markword的部分里
jdk1.6以后对synchronized进行了优化,如果进入monitor的话, 称之为重量级锁。在锁升级到重量级锁之前,还有无锁、偏向锁、轻量级锁几个状态,状态存在对象头o的markword的锁标记位置。重量级锁是10
网友评论