关键字synchronized
-
使每个线程依次排队操作共享变量 <效率低,但是基础>
-
原理
- 场景
- 方法
- 实例方法
synchronized void func()
- 静态方法 (类方法)
static synchronized void func()
- 实例方法
- 代码块
- 实例对象
synchronized(this)
- 类对象
synchronized(ClassA.class)
- 具体对象``string lock = “”; synchronized(lock)`
- 实例对象
- 方法
**自我理解: **
静态和实例的区别就是:
- 静态属于这个类的所有实例的方法都会被锁
- 实例仅仅锁住当前对象实例
- 场景
-
底层原理
-
监听器
- 先获取对象的监听器monitor才能继续执行
- 同一时刻只用一个线程可以获得对象的监听器monitor <互斥>
- 类对象的synchronized具有重入性,不需要再次获得锁
- 每个对象都有监听器,只有获得监听器才能继续操作,否则线程等待阻塞
-
A happens-before B
- A执行再B得前面
- A得结果对B可见 <B读取到的数据使A的值>
-
获取和释放锁的内存含义
-
获取锁
- 从主存中读取数据到工作内存
-
释放锁
- 将工作内存中的最新之刷新到主存
自我理解
对象的监听器和可见性
- synchronized优化
悲观锁 很是悲观,一开始就认为自己有冲突,获取锁的时候阻塞其他线程获取锁
乐观锁爱笑的人运气不会差,一开始认位没有冲突,不会阻塞其他线程的操作
-
CAS 比较交换
-
检测线程是否出现冲突
-
VON操作
-
V 内存存放的实际值
-
O 旧的值
-
N 更新的值
操作
V ==O -> V=N
V!=O -> return V
-
-
缺点
- ABA问题
解决方案:AtomicStampedReference Java1.5之后引入
- 自旋时间过长
- 只能保证一个共享变量的原子操作
解决方案: 常量类
- ABA问题
-
-
Java对象头
- 组成
- 锁状态
- 无状态
- 偏向锁
- 轻量锁
- 重量锁
- 对象hashcode
- 对象分代年龄
- 是否偏向锁
- 锁标记
- 锁状态
- 偏向锁
- 使获得锁的代价减少 <通过检查对象头,避免CAS操作>
- 等到竞争出现的时候才释放锁
- 轻量锁
- 执行代码前再栈帧创建锁记录空间
- 可升级为重量锁 <锁可以升级不能降级>
- 组成