在JDK的并发包里提供了几个非常御用的并发容器和并发工具类 ,供我们在多线程开发中进行使用
ConcurrentHashMap
为什么要使用ConcurrentHashMap
HashMap线程不安全 ,会导致数据错乱
使用线程安全的Hashtable效率低下
基于以上两个原因,便有了ConcurrentHashMap的登场机会
HashTable效率低下的原因:
HashTable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下HashTable的效率非常低下,因为当一个线程访问HashTable的同步方法,其他线程页访问HashTable的同步方法时,会进入阻塞状态,如线程1使用put进行元素添加,线程2不但不能使用put方法添加元素,也不能使用get方法获取元素,所以竞争越激烈效率越低

CountDownLatch
CountDownLatch允许一个或多个线程等待其他线程完成操作,再执行自己
例如:线程1执行打印:A和C,线程2执行打印B。但线程1在打印A后,要线程2打印B之后才能打印C,所以,线程1在打印A后,必须等待线程2打印完B之后才能继续执行
CountDownLatch构造方法
public CountDownLatch(int count) 初始化一个指定计数器的CountDownLatch对象
CountDownLatch重要方法
public void await() throws InterruptedException 让当前线程等待public voiud countDown() 计数器进行减1
说明:
CountDownLatch是通过一个计数器来实现的,每当一个线程完成了自己的任务后,可以调用countDown()方法让计数器-1,当计数器到达0时,调用CountDownLatch。
await()方法的献策韩国阻塞状态接触,继续执行
**
概述:
CyclicBarrier的字面意思是可循环(Cyclic)的屏障(Barrier)。它要做的事情是。让一组线程到达一个屏障(也可以叫同步点)时被阻塞,直到最后一个线程到达屏障才会开门,所以被屏障拦截的线程才会继续运行
例如:
公司召集5名员工开会,等5名员工都到了,会议开始
我们创建5个员工线程,1个开会线程。几乎同时启动,使用CyclicBarrier保证5名员工线程全部被执行后,再执行开会线程
CycllicBarrier构造方法
public CyslicBarrler(int parties,Runnable barrierAction) 用于在线程到达屏障时,优先执行barrierAction,方便处理更复杂的业务逻辑
CyclicBarrier重要方法:
public int await() 每个线程调用await方法告诉CyclicBarrler我要环境到达了屏障,然后当前线程被阻塞
使用场景
CycllicBarrier可以用于多线程计算数据,最后合并计算结果的场景
需求:使用两个线程读取2个文件中的数据,当两个文件中的数据都被读取完毕以后,进行数据的汇总操作
Semaphore
Semaphore(发信号)的主要作用是控制线程的并发数量
Synchronized可以起到“锁”的作用,但某个时间段内,只能有个线程允许执行
Semaphore可以设置同时允许几个线程执行
Semaphore字面意思是信号量的意思,它的作痛是控制访问特定资源的线程数目
Semaphore构造方法
public Semaphore(int permits) permits表示许可线程的数量public Semaphore(int permits,boolean fair) fair表示公平性,如果这个设为true的话,下次执行的线程会是等待最久的线程
Semaphore重要方法:
public void acquire() throws InterruptedException 表示获取许可public void release() release() 表示释放许可
Exchanger
概述:
EXchanger(交换者)是一个用于线程间协作的工具类,Exchanger用于进行线程间的数据交换
这两个线程通过exchanger方法交换数据,如果第一个线程先执行exchanger()方法,它会一直等待第二个线程也执行exchanger方法,当两个线程都到达同步点时,这两个线程就可以交换数据,将本线程生产出来的数据传递给对方
Exchanger构造方法
public Exchanger()
Exchanger重要方法
public v exchange(v,x)
使用场景
可以做数据校对工作
需求:比如我们需要将地址英航流水通过人工的方式录入成电子银行流水,为了避免错误,采用AB岗两人进行录入,录入到两个文件中,系统需要加载这两个文件
并对两个文件数据进行校对,看看是否一致
