Semaphore

大兔子大兔子 提交于 2020-01-25 00:53:57

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溢出的时候!!!!!

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!