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

来源:6-3 J.U.C之AQS-Semaphore

hyc努力努力再努力

2018-12-12

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

写回答

3回答

Jimin

2018-12-13

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

3
0

梦编猿

2020-04-14

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

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

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

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

1
1
梦编猿
所以假设 acquire(permits:n),Semaphore(permits:m)。 当 n > m 的时候,一个都输不出来,能明白了吗!
2020-04-14
共1条回复

Jimin

2018-12-13

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

0
2
Jimin
回复
hyc努力努力再努力
嗯,是一个线程直接去拿三个许可,拿到3个才可以执行
2018-12-13
共2条回复

Java高并发编程,构建并发知识体系,提升面试成功率

构建完整并发与高并发知识体系,倍增高薪面试成功率!

3923 学习 · 832 问题

查看课程