AQS之Semaphore源码
2023-08-22 18:08:25 2 举报
AQS之Semaphore源码
作者其他创作
大纲/内容
AQS当前线程是否中断
false
当前线程封装成Node
doReleaseShared();
AQS
继续唤醒下一个线程
如果下一个有线程在排队
throw new InterruptedException();
true,许可证数量不够分
setState(permits);
semaphore.release();
state=2
semaphore = new Semaphore(2,true);
方法剖析
if (tryAcquireShared(arg) < 0)
线程释放许可证
true,遇到中断抛出异常
唤醒下一个线程
if (Thread.interrupted())
线程获取许可证
FairSync
原理与ReentrantLock一致
cas资源+1
唤醒
当前线程竞争成功,头结点变为当前线程,属性置空GC回收
doAcquireSharedInterruptibly(arg);
共享模式会继续唤醒后续线程
构造方法true声明公平锁
当前线程的前驱节点
new FairSync(permits)
如果前驱结点是队头,再次尝试获取锁
阻塞住线程等待被唤醒
入队,进入同步等待队列阻塞
限制线程并发的数量,许可证=2
if (tryReleaseShared(arg))
this.waitStatus=0;this.prev=null;this.next=null;this.nextWaiter = SHARED;this.thread = t1;
semaphore.acquire();
唤醒阻塞的线程
0 条评论
下一页