网站制作模板下载设计托管网站建设
2026/1/26 16:00:49 网站建设 项目流程
网站制作模板下载,设计托管网站建设,一个网站的建设需要哪些流程图,去年做啥网站致富一、背景#xff1a;共享模式 vs 独占模式 独占模式#xff08;Exclusive#xff09;#xff1a;如 ReentrantLock#xff0c;一次只允许一个线程持有锁。 释放时#xff1a;只需唤醒队列中的下一个等待者#xff08;调用 unparkSuccessor(head) 即可#xff09;。 共享…一、背景共享模式 vs 独占模式独占模式Exclusive如ReentrantLock一次只允许一个线程持有锁。释放时只需唤醒队列中的下一个等待者调用unparkSuccessor(head)即可。共享模式Shared如Semaphore、CountDownLatch、ReadWriteLock的读锁。允许多个线程同时持有锁只要资源足够。所以一旦资源可用可能要连续唤醒多个等待线程这就引出了“传播propagation”的概念。二、核心问题如何确保“所有能获取资源的线程都被唤醒”假设当前有 3 个线程在 AQS 队列中等待共享锁A → B → C。此时资源释放了比如信号量 permit 1。线程 A 被唤醒并成功获取资源。但此时资源仍然充足比如 permit 还剩 1那么 B 也应该被唤醒但如果只在释放时唤醒一次像独占锁那样B 和 C 就可能永远等下去即使资源已经可用。 因此共享模式必须支持“级联唤醒”或“传播唤醒”。三、PROPAGATE 和 SIGNAL 的作用Node.SIGNAL-1含义当前节点的后继节点需要被唤醒。这是 AQS 中通用的状态独占和共享都用。当一个节点入队后会把前驱设为SIGNAL表示“我等着你释放时记得叫我”。Node.PROPAGATE-3仅用于共享模式。含义即使当前没有明确的“需要唤醒”的信号也要继续传播释放动作。它是一种“保险机制”防止在并发竞争下漏掉唤醒。四、为什么需要 PROPAGATE—— 并发场景下的“信号丢失”问题考虑这个竞态条件race condition线程 T1 调用releaseShared()准备唤醒后继。此时队列 head 是 HH 的 waitStatus 是 0因为刚被设置为 head还没来得及设 SIGNAL。T1 检查到ws 0于是尝试 CAS 把它设为PROPAGATE表示“虽然现在没信号但我要记录这次释放以便后续传播”。与此同时另一个线程 T2 成功获取了共享锁并调用setHeadAndPropagate把新节点设为 head。如果没有PROPAGATET1 可能认为“没人需要唤醒”直接退出导致后面的线程无法被唤醒✅PROPAGATE的作用就是在状态不确定时留下一个“释放发生过”的标记确保后续操作能继续传播唤醒。五、代码逻辑精解setHeadAndPropagate(node, propagate)propagate 0表示tryAcquireShared返回正数说明还有剩余资源应该继续唤醒别人。条件判断很“保守”conservativeif(propagate0||hnull||h.waitStatus0||...)只要有任何迹象表明可能需要传播就调用doReleaseShared()。特别注意h.waitStatus 0包括SIGNAL(-1)和PROPAGATE(-3)都表示“需要关注后继”。doReleaseShared()这是一个自旋 CAS 的传播循环for(;;){Nodehhead;if(h!nullh!tail){intwsh.waitStatus;if(wsSIGNAL){// 正常情况后继需要唤醒CAS(SIGNAL→0);unparkSuccessor(h);}elseif(ws0){// 没有明确信号但可能是并发释放// 设为 PROPAGATE留下“释放已发生”的标记CAS(0→PROPAGATE);}}// 如果 head 没变说明稳定了可以退出if(hhead)break;} 关键思想即使当前看不出需要唤醒谁也要通过 PROPAGATE 确保“释放事件”不会丢失。六、举个实际例子SemaphoreSemaphoresemnewSemaphore(1);// 三个线程同时调用 sem.acquire()// 初始 permit 1只有第一个能成功其他两个入队等待。sem.release();// permit 变回 1release()→ 调用releaseShared()→doReleaseShared()唤醒第一个等待线程AA 获取 permit 后发现propagate 0因为 permit 用完了不传播但如果release()被调用了两次permit2则第一次唤醒 AA 获取后 permit1 →propagate1→ 继续传播触发第二次doReleaseShared()唤醒 B如果没有传播机制B 就卡住了七、总结精髓所在概念作用传播Propagation共享模式下一次释放可能需唤醒多个线程SIGNAL (-1)明确指示“后继需要唤醒”PROPAGATE (-3)在状态模糊时防止释放信号丢失的保险机制自旋 CAS 循环应对高并发下的状态竞争确保最终一致性✅设计哲学“宁可多唤醒几次unnecessary wake-ups也不能漏掉一次该唤醒的线程。”—— 这就是 AQS 共享模式的鲁棒性所在。附加Node.waitStatus 的几个值值常量含义0—初始状态-1SIGNAL后继需要被唤醒-2CONDITION在 Condition 队列中-3PROPAGATE共享模式下表示应继续传播释放1CANCELLED节点已取消希望这能帮你彻底理解 AQS 共享模式的“传播”机制

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询