AQS全称 AbstractQueuedSynchronizer 抽象队列同步器,java concurrent包里很多类中定义了Sync内部类继承自AQS,比如 ReentrantLock,CountDownLatch,Semaphore,CyclicBarrier(内部使用了ReentrantLock)等,下面我们来通过ReentrantLock源码解读AQS
1.定义两种资源共享方式:Exclusive(独占,只有一个线程能执行,如ReentrantLock)和Share(共享,多个线程可同时执行,如Semaphore/CountDownLatch)
2.定义了一个volatile int state,0代表空闲状态,1代表占用状态
3.定义了一个Node节点
4.定义了4个方法必须子类实现否则抛出异常
- tryAcquire(int):独占方式。尝试获取资源,成功则返回true,失败则返回false。
- tryRelease(int):独占方式。尝试释放资源,成功则返回true,失败则返回false。
- tryAcquireShared(int):共享方式。尝试获取资源。负数表示失败;0表示成功,但没有剩余可用资源;正数表示成功,且有剩余资源。
- tryReleaseShared(int):共享方式。尝试释放资源,如果释放后允许唤醒后续等待结点返回true,否则返回false。
1.LOCK
进入lock()方法(AQS非公平锁的实现类中)
ReentrantLock.java
这里重要的有三个方法:
- tryAcquire(arg):尝试获取锁
- addWaiter(Node.EXCLUSIVE):添加到同步队列
- acquireQueued(addWaiter(Node.EXCLUSIVE), arg)):队列里自旋等待获取等
刚开始pred=null走enq(node);方法
node为B节点,故p为head,因此进入tryAcquire(arg),再次抢占由于A线程一直占用所以还是false,因此进入
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;分支
- shouldParkAfterFailedAcquire(p, node)
- parkAndCheckInterrupt()
进入shouldParkAfterFailedAcquire(p, node) 方法
初始进入pred.waitStatus=0;进入 compareAndSetWaitStatus(pred, ws, Node.SIGNAL);
设置状态为Node.SIGNAL(-1)
第二次循环return true,进入parkAndCheckInterrupt()方法
B线程被阻塞挂起,使线程进入waiting状态,等待被unpark
进入unlock()方法
进入tryRelease(arg)方法
- tryAcquire(arg)
- addWaiter(Node.EXCLUSIVE)
- acquireQueued(addWaiter(Node.EXCLUSIVE), arg)
- shouldParkAfterFailedAcquire(p, node)
- parkAndCheckInterrupt()
release中
- unparkSuccessor(Node node)
到此这篇faiss数据库怎么读(数据库false什么意思)的文章就介绍到这了,更多相关内容请继续浏览下面的相关推荐文章,希望大家都能在编程的领域有一番成就!
版权声明:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若内容造成侵权、违法违规、事实不符,请将相关资料发送至xkadmin@xkablog.com进行投诉反馈,一经查实,立即处理!
转载请注明出处,原文链接:https://www.xkablog.com/rgzn-aibigd/17585.html