码迷,mamicode.com
首页 > 其他好文 > 详细

JUC学习(二)

时间:2020-03-07 13:30:19      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:条件   tar   sync   except   div   add   lock   练习   ons   

五、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学习(二)

标签:条件   tar   sync   except   div   add   lock   练习   ons   

原文地址:https://www.cnblogs.com/xbflovetj/p/12433424.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!