一、阻塞队列
1、在多线程领域,所谓阻塞,在某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒
2、ArrayBlockingQueue(效率高)和LinkedBlockingQueue是两个最常用的阻塞队列,一般情况下用来处理多线程间的生产者消费者问题。

二、并发队列
ConcurrentLinkedQueue

传统方式下用Collections工具类提供的synchronizedCollection方法来获得同步集合。

三、同步集合类
java5中还提供了如下一些同步集合类:
> java.util.concurrent - Java并发工具包
> ConcurrentHashMap 进行HashMap的并发操作,用来替代Collections.synchronizedMap(m)方法。
> ConcurrentSkipListMap 实现了SortedMap<K,V>,类似于TreeMap
> ConcurrentSkipListSet 实现了SortedSet, 类似于TreeSet
> CopyOnWriteArrayList
> CopyOnWriteArraySet
注:CopyOnWriteArrayList和CopyOnWriteArraySet,最适合于读操作通常大大超过写操作的情况。

传统方式下Collection在迭代时,不允许对集合进行修改,使用Iterator对集合进行迭代时也不能修改集合;其中CopyOnWriteArrayList在遍历的时候修改是不会出错的,实现方法是读写分离。

四、ReentrantLock
Condition实现线程间的通信,类似在线程中的Object.wait()和Object.notify()
eg、 private Lock lock = new ReentrantLock(); // 账户锁
private Condition _save = lock.newCondition(); // 存款条件
private Condition _draw = lock.newCondition(); // 取款条件

五、ReadWriteLock--实现读写锁
eg、private ReadWriteLock rwl = new ReentrantReadWriteLock();
rwl.readLock();
rwl.writeLock();

六、线程池,5种
缓存线程池、固定大小线程池、调度线程池、单例线程池、自定义线程池(参数:线程数、最大线程数、空闲时间、时间单位、队列)

七、生产消费模式
并发队列ConcurrentLinkedQueue和阻塞队列LinkedBlockingQueue、ArrayBlockingQueue

八、synchronized锁和ReentrantLock锁的区别

synchronized是在JVM层面上实现的,可以通过一些监控工具监控synchronized的锁定,而且在代码执行时出现异常,JVM会自动释放锁定,但是使用Lock则不行,lock是通过代码实现的,要保证锁定一定会被释放,就必须将unLock()放到finally{}中

在资源竞争不是很激烈的情况下,Synchronized的性能要优于ReetrantLock,但是在资源竞争很激烈的情况下,Synchronized的性能会下降几十倍,但是ReetrantLock的性能能维持常态;

九、CountDownLatch、CyclicBarrier(同步屏障)、信号灯区别

1、CyclicBarrier 多个线程相互等待,直到所有的线程都完成,如果他们之间任何一个线程没有完成,所有的线程都必须等待。
eg、await()、getNumberWaiting()

2、CountDownLatch 控制多个线程的执行顺序,调用await()方法的任务将一直阻塞等待,直到这个CountDownLatch对象的计数值countDown()减到0为止。
eg、有一个任务想要往下执行,但必须要等到其他的任务执行完毕后才可以继续往下执行。

3、Semaphore 信号灯,场景:停车场运作、限流
假设停车场只有三个车位,一开始三个车位都是空的。这时如果同时来了五辆车,看门人允许其中三辆不受阻碍的进入,然后放下车拦,剩下的车则必须在入口等待,此后来的车也都不得不在入口处等待。这时,有一辆车离开停车场,看门人得知后,打开车拦,放入一辆,如果又离开两辆,则又可以放入两辆,如此往复。

// 获取许可
semp.acquire();
...
// 访问完后,释放
semp.release();

最新文章

  1. C# 深入浅出 异步(八)
  2. EF之ExecuteSqlCommand更新出现无效的解决方案
  3. 两种include方式及filter中的dispatcher解析
  4. Android线程优先级设置方法技巧
  5. mysql 配置文件 value
  6. 地址标记,SpringMVC转发与调用相关知识存档
  7. LeetCode——Jump Game II
  8. HDU 4031 Attack(线段树/树状数组区间更新单点查询+暴力)
  9. Atlassian如何实施DevOps
  10. java类中定义接口
  11. LeetCode 3
  12. MongoDB-GRIDFS大文件系统
  13. lesson2:java阻塞队列的demo及源码分析
  14. WPF中获取控件之间的相对位置
  15. VC++深入详解读书笔记-第七章对话框
  16. SumoLogic
  17. JQ与AJAX 省市区三级联动下拉框
  18. tkinter做一个简单的登陆页面(十六)
  19. 计数排序/Counting Sort
  20. HTTPS为什么更安全,先看这些 , 网络加密 , 加密解密

热门文章

  1. android上的i-jetty (1)环境搭建
  2. 微信小程序-flex布局中align-items和align-self区别
  3. Objective-C 对象和消息模型
  4. ASP.NET MVC Bundles 合并压缩(js css)
  5. 关于国密算法 SM1,SM2,SM3,SM4 的笔记
  6. php开发工具,zendstudio13使用方法补丁
  7. Android-Kotlin-代理和委托
  8. Android-ANR异常
  9. Excel 两列单元格合并超级链接的VBA 写法
  10. mysql 多个and的简写