【JUC】JUC并发编程(3)
前言:
本文内容:Condition实现精准通知唤醒、八锁现象理解解锁、CopyOnWriteArrayList
推荐免费JUC并发编程视频:【狂神说Java】JUC并发编程最新版通俗易懂_哔哩哔哩_bilibili
Condition实现精准通知唤醒
A执行后调用B,B执行后调用C,C执行后调用A
1 | package com.jokerdig.pc; |
运行结果
1 | A->A |
八锁现象理解解锁
八锁就是关于锁的八个问题
synchronized锁
1 | package com.jokerdig.lock8; |
运行结果
1 | 发短信 |
结论:
- synchronized 锁的对象是方法的调用者
- 两个方法是同一个锁,谁先拿到谁先执行
- 在同一把锁释放之前,另一个方法都不会执行
两个对象调用synchronized锁
1 | package com.jokerdig.lock8; |
运行结果
1 | 打电话 |
synchronized锁和普通方法
1 | package com.jokerdig.lock8; |
运行结果
1 | hello |
结论:
- 普通方法不受锁的限制
两个对象调用
1 | package com.jokerdig.lock8; |
运行结果
1 | 打电话 |
static方法
1 | package com.jokerdig.lock8; |
运行结果
1 | 发短信 |
结论:
- static 静态方法,类一加载就存在了, 锁的是Class->模板
- 类有唯一的一个Class对象
两个对象调用static方法
1 | package com.jokerdig.lock8; |
运行结果
1 | 发短信 |
结论:
- 和对象无关,锁的是全局唯一的Class类
static方法和普通方法
1 | package com.jokerdig.lock8; |
运行结果
1 | 打电话 |
结论:
- static方法 锁的是Class
- 没有static 锁的是对象
- 它们的锁互不影响
两个对象调用static和非static
1 | package com.jokerdig.lock8; |
运行结果
1 | 打电话 |
总结
- new this 具体的对象
- static Class唯一的模板
CopyOnWriteArrayList
多线程下List安全问题
多线程下List出现:java.util.ConcurrentModificationException
并发修改异常
解决方案:
- 使用
Vector<>
默认是安全的Vector
底层是添加了synchronized
- 使用
Collections.synchronizedList(new ArrayList<>());
- 使用
new CopyOnWriteArrayList<>();
(推荐)
1 | package com.jokerdig.unsafe; |
运行结果
1 | [6882d, a3603, 5ef2f] |
总结
CopyOnWrite
写入时复制COW
计算机程序设计领域的一种优化策略- 多个线程调用,
List
读取的时候,固定的写入(覆盖) - 再写入时避免覆盖,造成数据问题
- 读写分离
- 主要优化:
CopyOnWrite
读取的时候不加锁,而synchronized
在读取的时候也是加锁的
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Hey,Joker!
评论
ValineTwikoo