目录
悲观锁synchronized
synchronized的用法
只能锁引用类型
对象的内存布局(引用型)
JDK1.6之前的锁----重量级锁
1.6之后---偏向锁,轻量级锁(自适应自旋锁)
偏向锁
轻量级锁
区别
某些场景使用重量级锁的原因
synchronized是不公平锁
synchronized的原子性、可见性与有序性
参考博客
悲观锁synchronized
悲观锁就是觉得所有线程的操作都是不安全的,所以会直接给每个线程加上锁。
悲观锁性能较低。
synchronized的用法
java内置关键字,只能作用于方法与代码块,不能作用于变量。
只能锁引用类型
对象的内存布局(引用型)
数组类型
JDK1.6之前的锁----重量级锁
有等待队列,进入等待队列(即阻塞状态),唤醒缓慢
1.6之后---偏向锁,轻量级锁(自适应自旋锁)
偏向锁
轻量级锁
由偏向锁升级而来的
区别
所以,重量级锁就是,a取锁,b进队列,b阻塞,浪费资源。
自旋锁就是,a取锁,b自旋循环,n次挂起。
自适应自旋锁就是,a取锁,b自旋循环,b取锁,c就自旋更长时间;
若b自旋不成功,c直接放弃。
某些场景使用重量级锁的原因
运气不好的线程,自旋是要消耗cpu资源的,cpu资源很昂贵
synchronized是不公平锁
synchronized的原子性、可见性与有序性
内存具有不可见性。
解决了不可见性:
当进入synchornized
保护的代码前,将同步代码中用到的共享资源在缓存中清楚,在使用时,直接从主存拉取,在退出同步代码块前,直接将对共享资源的操作更新至主存,这样就保证了内存的可见性。
参考博客
面试干货9——synchronized的底层原理_synchronized底层原理面试题-CSDN博客