目录
一、samaphore
1、介绍
2、应用
3、原理
二、countdownlatch
三、cyclicbarrier
一、samaphore
1、介绍
信号量,用来限制同时访问共享资源的线程上限。可以理解为停车场入口的提示排,标识有多少车位,有车位才能进去停车,samaphore就是这个管理车位上限的功能。
使用前先要new一个samaphore对象,然后线程要调用acquire方法获取许可才能运行,不然就在阻塞队列里面等待。
2、应用
使用semaphore限流,在访问高峰期时,让请求线程堵塞,高峰期过去再释放许可,当然他只适合限制单机线程数量,并且仅是限制线程数,不是线程资源数(例如连接数等)
用semaphore实现简单连接池,对比享元模式下实现,性能和可读性显然更好
3、原理
构造器:我们在构造的时候要传入信号量的大小,他其实就是调用的aqs同步器,然后把那个state赋值为了3
获取:每次要用就去调用方法用cas把state的数量减去一,当小于0就去阻塞队列里面创建头结点然后指向这个节点,把头设为-1,跟之前的一样就是aqs堵塞队列。
释放:释放会拿到state然后用cas把状态+1,拿到头节点为-1就改为0然后把后继节点唤醒,然后就看看能不能拿到锁,然后一个个往后唤醒,但是如果没有型号量了还是循环一次就又进队列了
二、countdownlatch
倒计时锁,用来做线程之间的同步协作,构造参数用来初始化等待计数,await用来等待计数归零,countdown用来计数减一
底层也是维护了个同步器继承AQS,他也是构造器直接复制到aqs的state,但跟其他同步器不同,他是state为0就能获得锁,当大于0就会被堵塞。当其他线程线程执行完调用释放的时候就用cas让计数器-1。
三、cyclicbarrier
循环栅栏,用来进行线程协作,等待线程满足某个计数,构造时设置计数,每个线程执行到某个需要同步的时刻调用await方法进行等待,当等待的线程满足计数个数的时候,继续执行
他比countdownlatch的好处就是可以循环运行,countdown是只能使用一次。