一、Semaphore 信号量
new Semaphore(10)
可以把他理解成停车场,最多停10辆车,多个车进来如果满了就去排队,车走了,车位就空出来了,排队的线程就可以进来
主要下面2个方法
Acquire获取锁:通过CAS原子性减1,如果大于0获取锁成功,如果小于<0,那么说明信号量被用完了,添加到队列中等待。
release释放锁:释放锁都是通过自选的调用CAS方法减1,如果成功,就唤醒阻塞队列里面的线程。
二、Exchanger
线程同步器类
Exchanger是适用在两个线程之间数据交换的并发工具类,它的作用是找到一个同步点,当两个线程都执行到了同步点(exchange方法)之后(有一个没有执行到就一直等待,也可以设置等待超时时间),就将自身线程的数据与对方交换。
基本操作:exchange(V)
exchanger.exchange(User) 如果先到,就等待,第二个线程执行到这里,判断是否有人先到,先到的话,就执行替换。
CyclicBarrier
循环屏障:作用就是多个线程调用wait,只有当wait的线程数量达到一定的数量后,才会触发唤醒所有wait的线程,没有达到那就都在等待。
只有等Barrier等于0才会执行其他步骤。
1、await()方法会计数,只要达到初始化设置的【公共屏障点】就会触发所有线程执行后面的流程,否则参与的线程都处在等待状态。
2、原理也很简单:一开始设置一个数值,只要线程调用一次wait,那么就这个数字就减一,如果这个数值最终不等于0,那么调用wait的线程就去睡眠,
如果这个数字最终等于0,那么就唤醒所有等待队列的线程。