synchronized原理
特点
1.synchronized既是一个悲观锁,又是个乐观锁,自适应的!
synchronized默认是乐观锁,但是如果发现锁竞争比较激烈,就会变成悲观锁!!
2.synchronized既是轻量级锁,又是一个重量级锁,自适应!
synchronized默认是轻量级锁,当锁冲突剧烈后,就变成重量级锁!
3.synchronized这里的轻量级锁是基于自旋锁的方式实现的
synchronized这里的重量级锁是基于挂起等待锁的方式实现的
4.synchronized不是读写锁
5.synchronized是可重入锁
6.synchronized是非公平锁两个线程针对同一个变量加锁,就会阻塞等待.除了上述基本原理,synchronized还有一些内部的优化机制,存在的目的就是为了让锁更高效,好用.
加锁工作过程——锁升级/锁膨胀
当执行到加锁的代码块儿时,加锁过程就可能经历下面几个升级阶段:为了在线程安全和性能做权衡
无锁
无锁状态,还没开始加锁偏向锁
进行加锁的时候,首先会进入偏向锁状态
偏向锁,并不是真正的加锁,而只是先占个位置,如果有需要就加锁,没需要就不加锁了
相当于"懒汉模式"提到的懒加载一样,非必要,不加锁
synchronized加锁的时候,并不是真正的加锁,而是先进入偏向锁状态,就相当于做一个标记,如果一直没有别的线程来获取这个锁,那么就不会升级,仅仅只做个标记,因为这个变量本来就只有这个线程要使用,过程也没有出现锁竞争,执行完synchronized{}代码块后,再取消掉标记(偏向锁)即可。
但是如果出现了锁竞争,再另一个线程加锁之前,偏向锁会迅速升级为真正的加锁状态!!另一个线程阻塞等待...