Semaphore 信号量
semaphore有两种方式,一种是公平的方式,一种是非公平的方式。
public Semaphore(int permits, boolean fair) {
sync = fair ? new FairSync(permits) : new NonfairSync(permits);
}
非公平只体现在加锁的同时看是否有空闲的资源,如果有,就取,如果没有再排队。
公平,就是直接去排队。
acquire:
信号量用的还是aqs中的sync,构造方法中的permits是信号量的数量。
同时被设置到了aqs中的state中。
而acquire的方法实现在了Semaphore中
1. 如果有前驱节点,也就是前面有人在等,那就失败
2. 如果没有前驱节点,取当前sync的state,根据state-acquire算出remaining,如果remaining<0 或者修改成功就返回
2.1 如果remaining<0返回后,会生成节点加入aqs的队列中
2.1.1 如果是head,那么再取一次锁,如果取到了锁,则通知下一个
2.1.2 否则,park线程



release:
1. 给state增加当前的信号量数量
2. 通知sync队列中的下一个,waitStatus到底是0还是-3??怎么通知下一个??
但是有个疑问,为什么next会<current呢?
interger溢出的时候!!!!!



来源:CSDN
作者:47_Alice
链接:https://blog.csdn.net/weixin_41805865/article/details/103952950
