JUC学习

Posted xbflovetj

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了JUC学习相关的知识,希望对你有一定的参考价值。

五、Synchronized 与 JUC 具体实现对比

  Synchronized JUC
判断 Object Condition
等待 wait await
通知 notify/notifyAll signal/signalAll
线程之间的通信: 判断  执行  通知
虚假唤醒问题:使用while进行条件判断

六、8锁练习

synchronized 修饰,锁的对象是方法的调用者,static 修饰,锁的对象是 Class 模板对象

  1. 资源类被 synchronized 修饰,标准情况下,先调用的先执行
  2. 资源类被 synchronized 修饰,即使先调用的方法有休眠,先调用的先执行
  3. 资源类被 synchronized 修饰,未被修饰的普通方法,不受锁的影响
  4. 资源类被 synchronized 修饰,两个调用者,相互间不受锁影响
  5. 被 static 修饰的方法,不会因为 synchronized  修饰而变化,是全局锁
  6. 被 static 修饰的方法,不会因为 synchronized  修饰而变化,即使有两个调用者,仍然是全局锁
  7. 被 static 修饰的方法,不会因为 synchronized  修饰而变化,不被 static 修饰但被 synchronized 修饰的方法,调用者锁不受全局锁影响
  8. 被 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学习四(集合不安全问题)

JUC 系列:AQS -->学习 Doug Lea 大神思想

JUC 系列:AQS -->学习 Doug Lea 大神思想

JUC 系列:AQS -->学习 Doug Lea 大神思想

JUC 系列:AQS -->学习 Doug Lea 大神思想

Java多线程之JUC包:Semaphore源码学习笔记