网站源码怎么打开wordpress很安全
2026/5/21 20:18:09 网站建设 项目流程
网站源码怎么打开,wordpress很安全,会网站开发想找兼职,泉州网页模板建站一、AQS 是什么#xff1f; AQS#xff08;AbstractQueuedSynchronizer#xff09; 是 Java 并发包的核心组件#xff0c;可以把它想象成一个万能排队管理器。它管理着一个虚拟的排队队列#xff0c;让线程能够有序地获取和释放资源。 核心思想#xff1a; 一个状态变量AQSAbstractQueuedSynchronizer是 Java 并发包的核心组件可以把它想象成一个万能排队管理器。它管理着一个虚拟的排队队列让线程能够有序地获取和释放资源。核心思想一个状态变量state表示资源数量一个 FIFO 队列管理等待线程提供获取/释放资源的模板方法二、AQS 的核心结构// 简化版 AQS 内部结构publicabstractclassAbstractQueuedSynchronizer{// 1. 状态变量 - 核心privatevolatileintstate;// 2. 等待队列的节点staticfinalclassNode{Threadthread;// 等待的线程Nodeprev;// 前驱节点Nodenext;// 后继节点intwaitStatus;// 等待状态}// 3. 队列头尾privatetransientvolatileNodehead;privatetransientvolatileNodetail;}三、AQS 的工作原理比喻版想象一个公共厕所state 1有一个坑位可用队列等待上厕所的人排成的队伍每个人线程按顺序使用四、实战示例自己实现一个锁1. 最简单的互斥锁实现importjava.util.concurrent.locks.AbstractQueuedSynchronizer;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;/** * 自己实现的简易锁 - 基于 AQS */publicclassMySimpleLock{// 内部同步器privatestaticclassSyncextendsAbstractQueuedSynchronizer{// 尝试获取锁CAS 设置 state 从 0 到 1OverrideprotectedbooleantryAcquire(intarg){// 使用 CAS 原子操作尝试获取锁if(compareAndSetState(0,1)){// 设置当前线程为独占所有者setExclusiveOwnerThread(Thread.currentThread());returntrue;}returnfalse;}// 尝试释放锁OverrideprotectedbooleantryRelease(intarg){if(getState()0){thrownewIllegalMonitorStateException();}// 清除独占所有者setExclusiveOwnerThread(null);// 注意state 设置要在最后保证可见性setState(0);returntrue;}// 是否被当前线程独占OverrideprotectedbooleanisHeldExclusively(){returngetExclusiveOwnerThread()Thread.currentThread();}}privatefinalSyncsyncnewSync();publicvoidlock(){sync.acquire(1);// AQS 的模板方法}publicvoidunlock(){sync.release(1);// AQS 的模板方法}}2. 测试我们的锁publicclassAQSDemo{privatestaticintcount0;privatestaticfinalMySimpleLocklocknewMySimpleLock();publicstaticvoidmain(String[]args)throwsInterruptedException{// 创建 10 个线程并发累加Thread[]threadsnewThread[10];for(inti0;i10;i){threads[i]newThread(()-{for(intj0;j1000;j){lock.lock();// 加锁try{count;// 临界区操作}finally{lock.unlock();// 解锁}}});}// 启动所有线程for(Threadt:threads){t.start();}// 等待所有线程完成for(Threadt:threads){t.join();}System.out.println(最终结果: count);// 应该是 10000}}五、可重入锁实现像 ReentrantLock/** * 可重入锁实现 - 支持同一个线程重复加锁 */publicclassMyReentrantLock{privatestaticclassSyncextendsAbstractQueuedSynchronizer{// 获取锁OverrideprotectedbooleantryAcquire(intacquires){ThreadcurrentThread.currentThread();intcgetState();// 状态为 0表示锁未被占用if(c0){if(compareAndSetState(0,acquires)){setExclusiveOwnerThread(current);returntrue;}}// 锁已被占用检查是否是当前线程重入elseif(currentgetExclusiveOwnerThread()){intnextccacquires;// 增加重入次数if(nextc0){thrownewError(Maximum lock count exceeded);}setState(nextc);// 更新状态returntrue;}returnfalse;}// 释放锁OverrideprotectedbooleantryRelease(intreleases){intcgetState()-releases;if(Thread.currentThread()!getExclusiveOwnerThread()){thrownewIllegalMonitorStateException();}booleanfreefalse;if(c0){freetrue;setExclusiveOwnerThread(null);}setState(c);returnfree;}// 创建 Condition 对象publicjava.util.concurrent.locks.ConditionnewCondition(){returnnewConditionObject();}}privatefinalSyncsyncnewSync();publicvoidlock(){sync.acquire(1);}publicvoidunlock(){sync.release(1);}publicbooleantryLock(){returnsync.tryAcquire(1);}}六、信号量实现像 Semaphore/** * 信号量实现 - 控制同时访问的线程数 */publicclassMySemaphore{privatestaticclassSyncextendsAbstractQueuedSynchronizer{Sync(intpermits){setState(permits);// 初始化许可数量}// 获取许可OverrideprotectedinttryAcquireShared(intacquires){for(;;){// 自旋intavailablegetState();intremainingavailable-acquires;// 如果剩余许可不足或者 CAS 成功if(remaining0||compareAndSetState(available,remaining)){returnremaining;}}}// 释放许可OverrideprotectedbooleantryReleaseShared(intreleases){for(;;){// 自旋intcurrentgetState();intnextcurrentreleases;if(nextcurrent){thrownewError(Maximum permit count exceeded);}if(compareAndSetState(current,next)){returntrue;}}}}privatefinalSyncsync;publicMySemaphore(intpermits){syncnewSync(permits);}publicvoidacquire()throwsInterruptedException{sync.acquireSharedInterruptibly(1);}publicvoidrelease(){sync.releaseShared(1);}}七、AQS 在 JDK 中的应用publicclassAQSApplications{publicstaticvoidmain(String[]args){// 1. ReentrantLock - 可重入锁ReentrantLocklocknewReentrantLock();// 2. Semaphore - 信号量SemaphoresemaphorenewSemaphore(5);// 5个许可// 3. CountDownLatch - 倒计时门闩CountDownLatchlatchnewCountDownLatch(3);// 4. ReentrantReadWriteLock - 读写锁ReentrantReadWriteLockrwLocknewReentrantReadWriteLock();// 5. CyclicBarrier - 循环屏障CyclicBarrierbarriernewCyclicBarrier(3);}}八、AQS 的关键方法获取资源的方法acquire(int arg)- 独占式获取忽略中断acquireInterruptibly(int arg)- 独占式获取响应中断tryAcquireNanos(int arg, long nanos)- 带超时的获取释放资源的方法release(int arg)- 独占式释放共享式方法acquireShared(int arg)- 共享式获取releaseShared(int arg)- 共享式释放九、AQS 的使用模式// 自定义同步器的通用模式classCustomSyncextendsAbstractQueuedSynchronizer{// 通常需要实现的方法// 1. tryAcquire/tryRelease - 独占模式// 2. tryAcquireShared/tryReleaseShared - 共享模式// 3. isHeldExclusively - 是否独占// 然后暴露给外部使用publicvoidcustomLock(){acquire(1);}publicvoidcustomUnlock(){release(1);}}十、总结与最佳实践AQS 的核心要点状态 State通过 volatile CAS 实现原子更新等待队列CLH 队列的变体公平管理线程排队模板方法子类只需实现 tryAcquire/tryRelease 等关键方法两种模式独占模式如锁、共享模式如信号量为什么用 AQS✅高效避免了 Java 内置锁的重量级操作✅灵活可以构建各种同步工具✅可靠JDK 验证生产就绪✅可控可以自定义公平/非公平策略使用建议优先使用 JDK 内置的并发工具ReentrantLock, Semaphore等只有特殊需求时才自定义 AQS理解底层原理有助于调试并发问题注意锁的粒度避免死锁AQS 是 Java 并发编程的基石理解它对于掌握 Java 高并发编程至关重要。虽然日常开发中不常直接使用但了解其原理能让你更好地使用并发工具并在面试中脱颖而出

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

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

立即咨询