请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

当允许的并发量是3 同时 acquire(3); release(3);的候为时什么会类似于单线程执行还是想不明白 。同时我把

当允许的并发量是3 同时 acquire(3); release(3);的候为时什么会类似单线程执行?? acquire的执行是一个一个获取请求的么 还是获取到请求以后就会立马去执行线程中的代码所以导致会一条一条的执行?
当我换成acquire(3); release()的时候 就只会执行一次就进行不下去了 这又是为什么呢?

正在回答 回答被采纳积分+3

3回答

Jimin 2018-12-13 00:35:46

最后一个问题,每次拿三个许可才执行,如果release只释放一个许可,那么相当于当前线程持有了两个许可没释放,而最大只有3个许可,这时其他线程想一下子拿三个许可就拿不到了,只能在那里等待,除非有线程释放了两个,阻塞的线程才能一下子拿到三个许可开始执行。因此呢,一次拿多个许可,一定要保证在当前线程里都进行了释放,否则会一直占着许可不放,导致其他线程永远拿不到许可,一直阻塞在那里。

3 回复 有任何疑惑可以回复我~
梦编猿 2020-04-14 17:47:11

我当时也看到这没理解。后来想了下,应该是这个意思:

new Semaphore(permits:3); 相当于开放了 3 个通道。

acquire(permits:3); 相当于占用了 3 个通道,注意注意:这里指的是一个线程(一辆大车)占用了 3 个通道,如果理解成也是开放了 3 个通道的话,就怎么想都想不明白的。

所以这样的话,你最后一个问题也迎刃而解,释放了 1 个通道的话,其他占用 3 个通道的大车,肯定会被堵住。

1 回复 有任何疑惑可以回复我~
  • 所以假设 acquire(permits:n),Semaphore(permits:m)。
    当 n > m 的时候,一个都输不出来,能明白了吗!
    回复 有任何疑惑可以回复我~ 2020-04-14 17:48:55
Jimin 2018-12-13 00:32:28

你好,acquire代表的或许的许可数,如果希望同时执行的线程数为3,那么代表同一时间能使用的最多有3个许可。如果每次执行时拿走3个许可,其他线程就拿不到许可了,因此就和单线程一样了。
acquire每次拿到许可,就可以执行,拿不到许可就一直等待,等待到拿到许可为止(也允许等待指定的时间)

0 回复 有任何疑惑可以回复我~
  • 老师您好。您的意思就是。 现在信号量是3 允许3个线程并发。但是aquire(3)一条线程执行就需要3个许可。是这个意思么?
    回复 有任何疑惑可以回复我~ 2018-12-13 08:08:52
  • Jimin 回复 提问者 hyc努力努力再努力 #2
    嗯,是一个线程直接去拿三个许可,拿到3个才可以执行
    回复 有任何疑惑可以回复我~ 2018-12-13 08:42:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信