synchronized
在 JDK 1.6 之前,synchronized 是重量级锁,效率低下。
从 JDK 1.6 开始,synchronized 做了很多优化,如偏向锁、轻量级锁、自旋锁、适应性自旋锁、锁消除、锁粗化等技术来减少锁操作的开销。
synchronized 同步锁一共包含四种状态:无锁、偏向锁、轻量级锁、重量级锁,它会随着竞争情况逐渐升级。synchronized 同步锁可以升级但是不可以降级,目的是为了提高获取锁和释放锁的效率。
synchronized 的底层原理
synchronized 修饰的代码块
通过反编译.class文件,通过查看字节码可以得到:在代码块中使用的是 monitorenter 和 monitorexit 指令,其中 monitorenter 指令指向同步代码块的开始位置,monitorexit 指令指明同步代码块的结束位置。
注:monitorenter是加锁指令,每个对象都有关联的monitor,如果要对这个对象加锁,就必须获取这个对象关联的monitor的lock锁。 monitor里面的原理和思路大概是这样的,monitor里面有一个计数器,从0开始。如果一个线程要获取monitor的锁,就会判断他的计数器是不是0,如果是0,那么说明没有人获取锁,他就可以获取锁,然后对计数器加一。同理释放锁的时候就会减一。 如果一个线程来获取montior锁时发现,值不是0,这个线程就会陷入阻塞状态,就会等待计数器变成0然后执行。
注意monitor的锁是支持重复加锁(同一个线程可以重复获取同一个锁)的
synchronized 修饰的方法
同样查看字节码可以得到:在同步方法中会包含 ACC_SYNCHRONIZED 标记符。该标记符指明了该方法是一个同步方法,从而执行相应的同步调用。
本文介绍了synchronized的相关知识。JDK 1.6前它是重量级锁,之后做了很多优化。其同步锁有四种状态,会随竞争升级且不可降级。还阐述了其底层原理,修饰代码块用monitorenter和monitorexit指令,修饰方法包含ACC_SYNCHRONIZED标记符。
170万+

被折叠的 条评论
为什么被折叠?



