JUC学习
Posted xbflovetj
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC学习相关的知识,希望对你有一定的参考价值。
五、Synchronized 与 JUC 具体实现对比
Synchronized | JUC | |
判断 | Object | Condition |
等待 | wait | await |
通知 | notify/notifyAll | signal/signalAll |
线程之间的通信: 判断 执行 通知
虚假唤醒问题:使用while进行条件判断
六、8锁练习
synchronized 修饰,锁的对象是方法的调用者,static 修饰,锁的对象是 Class 模板对象
- 资源类被 synchronized 修饰,标准情况下,先调用的先执行
- 资源类被 synchronized 修饰,即使先调用的方法有休眠,先调用的先执行
- 资源类被 synchronized 修饰,未被修饰的普通方法,不受锁的影响
- 资源类被 synchronized 修饰,两个调用者,相互间不受锁影响
- 被 static 修饰的方法,不会因为 synchronized 修饰而变化,是全局锁
- 被 static 修饰的方法,不会因为 synchronized 修饰而变化,即使有两个调用者,仍然是全局锁
- 被 static 修饰的方法,不会因为 synchronized 修饰而变化,不被 static 修饰但被 synchronized 修饰的方法,调用者锁不受全局锁影响
- 被 static 修饰的方法,不会因为 synchronized 修饰而变化,不被 static 修饰但被 synchronized 修饰的方法,两个调用者间不受影响
七、不安全的集合
只要是并发环境,集合类都是不安全的(List、Set、Map),会出现 ConcurrentModificationException 并发修改异常
List | Map | Set | |
导致原因 | add | put | add |
解决方法一 | Collections.synchronizedList(new ArrayList<>()) | Collections.synchronizedMap(new HashMap<>()) | Collections.synchronizedSet(new HashSet<>()) |
解决方法二 | new CopyOnWriteArrayList<>() | new ConcurrentHashMap<>() | new CopyOnWriteArraySet() |
CopyOnWrite; 写入是复制 (思想 COW),add源码
1 public boolean add(E e) { 2 final ReentrantLock lock = this.lock; 3 lock.lock(); 4 try { 5 Object[] elements = getArray(); 6 int len = elements.length; 7 Object[] newElements = Arrays.copyOf(elements, len + 1); 8 newElements[len] = e; 9 setArray(newElements); 10 return true; 11 } finally { 12 lock.unlock(); 13 } 14 }
new CopyOnWriteArraySet()
以上是关于JUC学习的主要内容,如果未能解决你的问题,请参考以下文章
JUC 系列:AQS -->学习 Doug Lea 大神思想
JUC 系列:AQS -->学习 Doug Lea 大神思想
JUC 系列:AQS -->学习 Doug Lea 大神思想