Synchronized
应用
- 修饰实例
- 修饰静态方法,当前class加锁
- 修饰代码块
对象内存布局
|| 对象头 || 实例数据 || 对齐填充
|| Mark word || 类型指针 || ||
|| hashcode,锁标志,GC信息..||
底层实现
synchronized基于monitor对象(多线程情况下对象访问monitor对象头,观察自己是否在monitor对象头中,以此来判断是否获取锁)
monitor底层通过操作系统mutex lock实现,
mutex lock会有用户态和内核态转换,开销大,
so: synchronized属于重量级锁
补充点锁的知识
优化
-
无锁 CAS
-
偏向锁
-
轻量锁
-
重量锁 synchronized
CAS (Compare And Set)
思路:当前内存值V,旧的预期值A,期待改变的值B,当且仅当预期值A与当前内存值V相等时,才将当前值改为B,否则返回false。
缺点:ABA问题。
解决ABA问题的方法:通过控制版本号,juc中提供一个带标记的原子引用类AtomicStampedReference。
锁优化
- 减少锁的持有时间:只有在必要的时候才加锁
- 锁粒度
- 细化:ConcurrentHashMap分段锁,对锁拆分可以增加吞吐量,但是弊端是获取全局锁时资源消耗增加,如获取整个size时
- 粗化:锁粒度过细会导致锁资源频繁的申请和释放,如遍历的过程最好在循环外加锁
- 锁分离
- 读写锁代替独占锁
- 自旋锁,适应性自旋锁
- 可重入锁
- 无锁
- CAS
- ThreadLocal