怎样做返利网站北京网站开发不限年龄
- 作者: 五速梦信息网
- 时间: 2026年03月21日 06:45
当前位置: 首页 > news >正文
怎样做返利网站,北京网站开发不限年龄,一级 做爰免费网站,网站建设需求调研AQS
AQS是什么#xff1f;重写AQS就能实现锁的效果#xff1f;
AQS是一个抽象类#xff0c;是一个并发包的基础组件#xff0c;用来实现各种锁#xff0c;同步组件的工具#xff08;通过volatile cas进行实现#xff09;。它包含了共享成员变量state、等待队列、条件…AQS
AQS是什么重写AQS就能实现锁的效果
AQS是一个抽象类是一个并发包的基础组件用来实现各种锁同步组件的工具通过volatile cas进行实现。它包含了共享成员变量state、等待队列、条件队列、加锁线程 并发中的核心组件。
共享成员变量state不同实现中有不同含义。
等待队列基于Node内部类实现了一个双向链表。
条件队列基于Node内部类实现了一个单项链表相当于Synchronized的wait和notify的一个等待唤醒机制的条件队列。
AQS自己继承了 AbstractOwnableSynchronizerowner就是锁的持有者对于线程信息的封装。
AQS还为我们自己实现锁和同步器采用模板方法模式提供了一些模板方法。我们只需要根据自己的逻辑实现方法的重写就可以实现各种不同的互斥/同步等效果。
例如ReentrantLock 可重入锁的实现阻塞 加锁 解锁 等操作都是基于 ReentrantLock 内部的AQS组件实现的本质上ReentrantLock只是提供了一系列相关的API。SemaphoreCountDownLatchCyclicBarrierRenentrantreadwritelockStampedLock
AQS有两种模式独占模式ReentrantLock CycleBarrier和 共享模式Semaphore CountDownLatch
独占和共享的最大区别就是State的定义不同独占模式下State只有0和1共享资源/临界区代码 只能由一个线程来执行但是共享模式下的State可以为多个只要是符合条件的当前线程都可以来使用。
补充 AQS的阻塞队列和条件队列的实现都是通过Node节点不过是通过Node节点的不同属性且一个是双向 一个是单向 阻塞队列双向的条件队列单向
阻塞队列中被park( ) 的线程是需要由前继节点老unpark( ) 唤醒的。 当node加入到阻塞队列尾部需要找到前一个节点把它的waitStatus设置成 -1表示它有责任唤醒后一个节点 条件队列是由别的线程来signal( ) 唤醒的且唤醒后会去阻塞队列中。 条件队列是FIFO尾进头出的不需要双向。
ReentryLock lockunlock
lock
加锁成功将state改为1设置owner为当前线程加锁失败 创建该线程对应的Node节点并加入等待队列此时waitStatus为0默认值会将加入队列的该线程调用Lock。unpark( ) 来阻塞然后设置该节点的前驱节点的waitStatus为-1用于后续unpark( ) 它
unlock 加锁成功的线程要解锁后会unlock( ) 掉阻塞队列中第一个节点的线程等待队列中出来的线程获取锁成功 setOwner为自己设置state为1更新等待队列 当unlock后如果被unpark( ) 的线程获取锁失败重新回到等待队列中并park( ) 掉
锁重入
lock
第一次会正常加上锁setOwner是自己然后修改state为1。第二次同一个线程又来加锁了会检查到当前线程owner线程说明发生了锁重入现象。然后会对state做一个累加操作作为锁重入的计数。
unlock
state–只是一直对state–并没有真正的释放锁当state0时说明才真的该释放锁。state0 时再执行unlock方法流程。
可打断
ReentrantLock分为不可打断模式 和 可打断模式 lock.lock() 不可被打断 lock.lockInterruptibly(); 可被打断使用时在API使用的不同选择的就是不同模式的加锁解锁方式
区别
不可打断模式没有真的打断只是设置打断标记为true。还是继续停留在等待队列中等待。当获取到锁之后才检查是否被打断再进行打断。可打断模式打断了通过抛出异常的方式保证当前线程被打断。
公平非公平
非公平锁默认和公平锁的主要区别在于 tryAcquire( ) 的实现。【尝试获取锁的方法】
当 state 0 后的操作不同
非公平锁一上来不会看等待队列中是否有阻塞等待的线程而是直接去cas操作去判断state来竞争锁公平锁一上来不会直接cas操作获取修改state而是先判断等待队列中是否有优先级比我高的队列实现了公平
相对来说非公平锁会更好的性能因为它的吞吐量比较大。
当然非公平锁让获取锁的时间变得更加不确定可能会导致在阻塞队列中的线程长期处于饥饿状态。 公平构造为 FairSync()
条件变量
每个条件变量其实对应着一个等待队列其实现类是ConditionObject。
ConditionObject中维护了以Node为节点的双向链表所构成的队列。但是只使用了单向
Await( )
首先获取到锁然后条件不满足时调用await( ) 。 此时创建一个新的Node状态为 -2并联这个不满足条件的线程加入条件队列的尾部。 进入AQS的fullRelease释放掉同步器上的锁。 设置owner为nullsetState 0unpark( ) 等待队列中的线程 去条件变量中等待的线程也会被park( ) 进入阻塞状态
Signal( )
有一个节点的转移会条件队列中获取队头元素转移到等待队列队尾并重置waitStatus0
只有owner中的线程才有资格唤醒条件变量中的所有者
取得在条件变量中队首的第一个Node会将满足条件的该线程转移到等待队列中等待下次重新获取锁。并将当前线程状态从-2改为0。因为等待队列中每次增加的元素都默认是0。 锁超时
public boolean tryLock()尝试获取锁获取到返回 true获取不到直接放弃不进入阻塞队列
public boolean tryLock(long timeout, TimeUnit unit)在给定时间内获取锁获取不到就退出
实现原理 成员变量指定超时限制的阈值小于该值的线程不会被挂起会自旋 static final long spinForTimeoutThreshold 1000L;超时时间设置的小于该值就会被禁止挂起因为阻塞在唤醒的成本太高不如选择自旋空转 tryLock() sync.nonfairTryAcquire(1);// 只尝试一次tryLock(long timeout, TimeUnit unit) //先尝试一次nonfairTryAcquire()后doAcquireNanos(arg, nanosTimeout);
// 获取最后期限的时间戳
// 计算还需等待的时间
// 时间已到 return false;
// 如果 nanosTimeout 大于该值才有阻塞的意义否则直接自旋会好点ReentrantLock 对比 Synchronized
ReentrantLock 相对于 synchronized 具备如下特点
锁的实现synchronized 是 JVM 实现的而 ReentrantLock 是 JDK 实现的性能新版本 Java 对 synchronized 进行了很多优化synchronized 与 ReentrantLock 大致相同使用ReentrantLock 需要手动解锁synchronized 执行完代码块自动解锁可中断ReentrantLock 可中断而 synchronized 不行公平锁公平锁是指多个线程在等待同一个锁时必须按照申请锁的时间顺序来依次获得锁 ReentrantLock 可以设置公平锁synchronized 中的锁是非公平的不公平锁的含义是阻塞队列内公平队列外非公平 锁超时尝试获取锁超时获取不到直接放弃不进入阻塞队列 ReentrantLock 可以设置超时时间synchronized 会一直等待 锁绑定多个条件一个 ReentrantLock 可以同时绑定多个 Condition 对象更细粒度的唤醒线程两者都是可重入锁
CyclicBarrier 对比 CountDownLatch
使用上的区别就是 CountDownLatch 的计数只能使用一次CyclicBarrier在计数变为0之后会重置计数
等待主体不同。调用await( ) 方法的对象不同。 CountDownLatch是主线程调用await( ) 来等待其他线程将state减为0再来执行。阻塞的是主线程。CyclicBarrier是工作线程调用await( ) await( ) 方法会对自身维护的计数器 -1 操作。阻塞的是工作线程。 多组线程等待共同到达一个栅栏点通过 signalAll( ) 一起出来并且把 count 重新置为 parties。 CountDownLatch是通过AQS的State信号量来实现的而CyclicBarrier是直接借助ReentrantLock加上Condition 等待唤醒的功能 进而实现的。
- 上一篇: 怎样做地方门户网站男男床做视频网站
- 下一篇: 怎样做公司官方网站营销网站建设hanyous
相关文章
-
怎样做地方门户网站男男床做视频网站
怎样做地方门户网站男男床做视频网站
- 技术栈
- 2026年03月21日
-
怎样做百度口碑推广自己的网站广东网站建设公司
怎样做百度口碑推广自己的网站广东网站建设公司
- 技术栈
- 2026年03月21日
-
怎样做1个网站网站制作价格多少钱
怎样做1个网站网站制作价格多少钱
- 技术栈
- 2026年03月21日
-
怎样做公司官方网站营销网站建设hanyous
怎样做公司官方网站营销网站建设hanyous
- 技术栈
- 2026年03月21日
-
怎样做公司官方网站专业性行业网站有哪些
怎样做公司官方网站专业性行业网站有哪些
- 技术栈
- 2026年03月21日
-
怎样做购物网站客户管理系统哪个好用
怎样做购物网站客户管理系统哪个好用
- 技术栈
- 2026年03月21日
