做视频网站要什么软件下载关闭开发者模式

张小明 2025/12/26 18:40:35
做视频网站要什么软件下载,关闭开发者模式,久久建筑网登录,上海最新新闻头条好的#xff0c;我将为你撰写一篇关于ReentrantLock实现原理的技术文档#xff0c;按照你要求的三个方面进行分析#xff0c;并采用诙谐幽默的比喻和实战例子来增强可读性。主要内容如下#xff1a; ReentrantLock是什么#xff1a;介绍ReentrantLock的定义和核心特点我将为你撰写一篇关于ReentrantLock实现原理的技术文档按照你要求的三个方面进行分析并采用诙谐幽默的比喻和实战例子来增强可读性。主要内容如下ReentrantLock是什么介绍ReentrantLock的定义和核心特点使用生活化的比喻解释其基本概念。ReentrantLock的核心特性通过表格对比和代码示例详细说明可重入性、公平性等核心特性。ReentrantLock的实现原理深入剖析AQS框架、加锁解锁过程以及公平/非公平锁的实现差异附带源码分析。接下来我将开始撰写文章正文。揭秘ReentrantLockJava并发编程中的超级锁利器1 什么是ReentrantLock从厕所排队说起想象一下这样的场景一个热门商场的厕所很多人同时想使用但每次只能进去一个人。这种独占使用厕所的场景在并发编程中就是典型的互斥访问问题。Java中的ReentrantLock可重入锁就是解决这类问题的一种高效工具它提供了比传统的synchronized关键字更强大、更灵活的锁机制。官方定义ReentrantLock是Java并发包java.util.concurrent.locks中的一种可重入互斥锁它具有与synchronized相同的并发性和内存语义但增加了更多高级功能。简单来说ReentrantLock就像是一个智能门禁系统它有三个核心特点互斥性像厕所门锁一样一次只允许一个线程进入可重入性如同你有权限重复进入同一个厕所虽然比喻有点奇怪同一线程可以多次获取同一把锁灵活性提供公平性选择、可中断的锁获取、超时机制等高级功能与synchronized相比ReentrantLock就像是功能更全面的高级门禁系统。synchronized是Java内置的关键字使用简单但功能有限而ReentrantLock是一个完整的类提供了更多精细控制能力。基本用法先睹为快ReentrantLocklocknewReentrantLock();// 创建非公平锁// ReentrantLock lock new ReentrantLock(true); // 创建公平锁publicvoidcriticalSection(){lock.lock();// 获取锁try{// 临界区代码 - 你的宝贵资源访问在这里System.out.println(线程Thread.currentThread().getName()正在操作共享资源);}finally{lock.unlock();// 必须确保释放锁}}注意lock.unlock()必须放在finally块中确保即使发生异常也能释放锁避免死锁。理解了ReentrantLock的基本概念后接下来我们看看它到底有哪些令人惊艳的特性让它成为并发编程中的明星组件。2 ReentrantLock的核心特性不只是个锁那么简单如果把synchronized比作一把普通门锁那么ReentrantLock就是一把智能指纹锁它提供了丰富多样的高级功能满足各种复杂场景的需求。让我们通过一个对比表格直观感受两者的区别表ReentrantLock与synchronized特性对比特性ReentrantLocksynchronized实现层面API层面JUC包JVM层面关键字锁的获取可尝试、可定时、可中断只能阻塞等待公平性可选公平锁或非公平锁只有非公平锁条件队列可绑定多个Condition只有一个等待池释放保证必须手动在finally中unlock()自动释放由JVM保证2.1 可重入性递归调用的通行证可重入性是ReentrantLock的核心特性之一。想象一下你进入一个房间后发现里面还有个内门需要同一把钥匙打开。可重入锁就允许你用同一把钥匙打开内门而不会被自己挡在门外。在技术层面可重入意味着同一线程可以多次获取同一把锁而不会被阻塞。这对于递归调用或者多个方法需要同一把锁的场景至关重要。publicclassRecursiveExample{privatefinalReentrantLocklocknewReentrantLock();publicvoidouter(){lock.lock();// 第一次获取锁try{inner();// 调用需要同一把锁的方法System.out.println(外部方法执行锁重入次数: lock.getHoldCount());// 查看重入次数}finally{lock.unlock();}}publicvoidinner(){lock.lock();// 第二次获取同一把锁重入try{// 一些操作System.out.println(内部方法执行当前重入次数: lock.getHoldCount());}finally{lock.unlock();}}}如果没有可重入性当线程在inner()方法中尝试获取锁时会因为自己已经持有锁而被阻塞导致死锁。而ReentrantLock通过内部计数器跟踪重入次数每次lock()时计数器加1每次unlock()时计数器减1直到计数器为0时锁才真正释放。2.2 公平性与非公平性排队还是插队ReentrantLock提供了公平锁和非公平锁两种模式这体现了它在锁策略上的灵活性。公平锁new ReentrantLock(true)像银行排队一样先来后到保证等待时间最长的线程优先获取锁非公平锁new ReentrantLock(false)默认像高峰期挤地铁允许插队新来的线程可能比先等待的线程先拿到锁性能权衡公平锁保证了公平性但性能较低线程切换频繁非公平锁虽然不公平但吞吐量更高。在大多数场景下非公平锁是更好的选择因为它能减少线程切换的开销。2.3 尝试锁与可中断灵活的资源获取策略ReentrantLock提供了多种灵活的锁获取方式避免线程无限期阻塞尝试锁tryLock像等电梯时设定时间限制如果等太久就走楼梯publicbooleantryIncrement(longtimeout,TimeUnitunit){try{if(lock.tryLock(timeout,unit)){// 尝试在指定时间内获取锁try{// 在指定时间内成功获取锁执行操作counter;returntrue;}finally{lock.unlock();}}else{// 超时未获取锁执行备用方案System.out.println(获取锁超时执行备用逻辑);returnfalse;}}catch(InterruptedExceptione){Thread.currentThread().interrupt();returnfalse;}}可中断锁在等待锁的过程中可以响应中断请求像排队时接到重要电话可以暂时离开。publicvoidinterruptibleLock(){try{lock.lockInterruptibly();// 可中断地获取锁try{// 执行操作while(!Thread.currentThread().isInterrupted()){// 检查中断状态}}finally{lock.unlock();}}catch(InterruptedExceptione){// 处理中断优雅退出System.out.println(锁获取被中断优雅退出);Thread.currentThread().interrupt();}}2.4 条件变量精细化的线程协调机制synchronized与wait()/notify()配合使用但只能有一个等待条件而ReentrantLock可以创建多个条件变量Condition实现更精细的线程协调。在生产者-消费者模型中这一特性特别有用publicclassBoundedBufferT{privatefinalReentrantLocklocknewReentrantLock();privatefinalConditionnotFulllock.newCondition();// 非满条件privatefinalConditionnotEmptylock.newCondition();// 非空条件privatefinalObject[]itemsnewObject[100];privateintputptr,takeptr,count;publicvoidput(Tx)throwsInterruptedException{lock.lock();try{while(countitems.length){notFull.await();// 等待非满条件}items[putptr]x;if(putptritems.length)putptr0;count;notEmpty.signal();// 通知非空条件已满足}finally{lock.unlock();}}publicTtake()throwsInterruptedException{lock.lock();try{while(count0){notEmpty.await();// 等待非空条件}Tx(T)items[takeptr];if(takeptritems.length)takeptr0;--count;notFull.signal();// 通知非满条件已满足returnx;}finally{lock.unlock();}}}通过使用不同的Condition我们可以精确控制哪些线程被唤醒避免synchronized中notifyAll()带来的惊群效应。了解了这些强大特性后你可能好奇ReentrantLock是如何在底层实现这些功能的呢接下来我们就深入其核心实现原理。3 ReentrantLock的实现原理深入AQS核心要理解ReentrantLock的工作原理我们需要先认识它的基石AQSAbstractQueuedSynchronizer即抽象队列同步器。AQS是Java并发包的核心框架ReentrantLock的所有功能都建立在AQS之上。3.1 AQS并发框架的核心引擎AQS可以看作是一个同步状态的管理器它内部维护了三个关键组件state状态字段volatile int类型变量表示锁的状态对于ReentrantLockstate 0表示锁未被占用state 0表示锁被占用数值表示重入次数独占线程记录当前持有锁的线程CLH队列一个虚拟的双向队列用于管理等待锁的线程AQS使用了模板方法模式它定义了获取锁和释放锁的骨架而具体的获取/释放逻辑则由子类实现。这种设计让AQS成为了一个强大的同步框架。3.2 加锁过程剖析以非公平锁为例当我们调用lock.lock()时背后发生了什么让我们以默认的非公平锁为例深入分析// NonfairSync的加锁过程finalvoidlock(){if(compareAndSetState(0,1)){// 1. 首先尝试CAS快速获取锁setExclusiveOwnerThread(Thread.currentThread());// 成功设置当前线程为独占者}else{acquire(1);// 2. 失败进入AQS获取流程}}// AQS的acquire方法publicfinalvoidacquire(intarg){if(!tryAcquire(arg)// 3. 再次尝试获取锁acquireQueued(addWaiter(Node.EXCLUSIVE),arg))// 4. 失败后加入队列并阻塞selfInterrupt();}这个过程可以类比为医院挂号的场景直接尝试插队新来的患者线程先不看排队情况直接问挂号窗口“现在能挂吗”CAS操作快速成功如果恰好没人挂号state 0直接成功避免排队开销正式排队如果窗口有人state ≠ 0则乖乖去排队进入CLH队列队列中等待在队列中耐心等待轮到自已时再次尝试非公平锁的tryAcquire实现// NonfairSync的tryAcquire实现protectedfinalbooleantryAcquire(intacquires){finalThreadcurrentThread.currentThread();intcgetState();// 获取当前状态if(c0){// 情况1锁未被占用if(compareAndSetState(0,acquires)){// CAS尝试获取setExclusiveOwnerThread(current);returntrue;}}elseif(currentgetExclusiveOwnerThread()){// 情况2重入intnextccacquires;// 增加重入次数if(nextc0)// 溢出检查thrownewError(Maximum lock count exceeded);setState(nextc);returntrue;}returnfalse;// 获取失败}3.3 释放锁过程唤醒后续等待者释放锁的过程相对简单主要工作是状态恢复和唤醒后继线程// ReentrantLock的unlock方法publicvoidunlock(){sync.release(1);// 委托给AQS的release方法}// AQS的release方法publicfinalbooleanrelease(intarg){if(tryRelease(arg)){// 尝试释放Nodehhead;if(h!nullh.waitStatus!0)unparkSuccessor(h);// 唤醒队列中的下一个线程returntrue;}returnfalse;}// Sync的tryRelease实现protectedfinalbooleantryRelease(intreleases){intcgetState()-releases;// 减少重入次数if(Thread.currentThread()!getExclusiveOwnerThread())thrownewIllegalMonitorStateException();// 只有持有者能释放booleanfreefalse;if(c0){// 完全释放freetrue;setExclusiveOwnerThread(null);}setState(c);returnfree;}释放过程的关键点是只有当重入次数减到0时锁才真正释放此时才会唤醒等待队列中的线程。3.4 公平锁 vs 非公平锁的实现差异公平锁与非公平锁的核心区别体现在tryAcquire方法的实现上// 公平锁的tryAcquire方法protectedfinalbooleantryAcquire(intacquires){finalThreadcurrentThread.currentThread();intcgetState();if(c0){// 关键区别多了hasQueuedPredecessors()检查if(!hasQueuedPredecessors()// 检查队列中是否有等待更久的线程compareAndSetState(0,acquires)){setExclusiveOwnerThread(current);returntrue;}}elseif(currentgetExclusiveOwnerThread()){// 重入逻辑与非公平锁相同intnextccacquires;if(nextc0)thrownewError(Maximum lock count exceeded);setState(nextc);returntrue;}returnfalse;}hasQueuedPredecessors()方法是公平性的守护者它检查同步队列中是否有比当前线程等待时间更长的线程。如果有当前线程就不能插队必须乖乖排队。3.5 正确使用ReentrantLock的注意事项虽然ReentrantLock功能强大但使用不当会导致严重问题。以下是几个关键实践要点1. lock()必须在try外部调用// 正确写法publicvoidcalculate(){lock.lock();// lock()在try外面try{// 临界区代码intresult100/0;// 可能抛出异常}finally{lock.unlock();}}// 错误写法可能导致异常信息被覆盖publicvoidcalculate(){try{lock.lock();// 错误lock()在try内部intresult100/0;}finally{lock.unlock();}}2. 必须使用try-finally确保锁释放publicvoidriskyMethod(){lock.lock();try{// 可能抛出异常的代码dangerousOperation();}finally{lock.unlock();// 保证无论发生什么锁都会被释放}}3. 避免在lock()和try之间插入代码publicvoidproblematicMethod(){lock.lock();intnum1/0;// 危险在加锁后、try之前可能抛出异常try{// 临界区代码}finally{lock.unlock();}}遵循这些最佳实践可以避免常见的陷阱确保ReentrantLock的正确使用。4 实战应用与总结4.1 实战场景举例场景1高性能计数器publicclassHighPerformanceCounter{privatefinalReentrantLocklocknewReentrantLock();privateintcount0;publicvoidincrement(){lock.lock();try{count;}finally{lock.unlock();}}// 使用tryLock实现非阻塞版本publicbooleantryIncrement(){if(lock.tryLock()){try{count;returntrue;}finally{lock.unlock();}}returnfalse;}}场景2简单的阻塞队列publicclassSimpleBlockingQueueT{privatefinalQueueTqueuenewLinkedList();privatefinalReentrantLocklocknewReentrantLock();privatefinalConditionnotEmptylock.newCondition();privatefinalConditionnotFulllock.newCondition();privatefinalintcapacity;publicvoidput(Titem)throwsInterruptedException{lock.lock();try{while(queue.size()capacity){notFull.await();// 等待非满条件}queue.offer(item);notEmpty.signal();// 通知非空条件}finally{lock.unlock();}}publicTtake()throwsInterruptedException{lock.lock();try{while(queue.isEmpty()){notEmpty.await();// 等待非空条件}Titemqueue.poll();notFull.signal();// 通知非满条件returnitem;}finally{lock.unlock();}}}4.2 总结与选型建议ReentrantLock是Java并发编程中的重要工具它基于AQS实现了高效、可重入的锁机制。通过分析源码我们了解了全局结构Sync、NonfairSync和FairSync的分工协作核心逻辑state管理锁状态CAS确保原子性生命周期初次上锁依赖CAS重入时更新state释放时递减state公平性非公平锁高吞吐公平锁防饥饿选型建议首选synchronized简单场景不需要ReentrantLock的高级功能时需要高级功能时选择ReentrantLock可中断、超时、公平锁、多个条件变量等复杂场景谨慎使用公平锁公平锁有性能开销除非必要如防止饥饿否则使用非公平锁确保正确释放unlock()必须放在finally块中避免死锁ReentrantLock提供了比synchronized更精细的锁控制是处理复杂并发场景的利器。通过深入理解其实现原理我们能够更好地利用这一强大工具编写出高效、可靠的并发程序。参考资料https://juejin.cn/post/7499317287724597299https://blog.csdn.net/weixin_45149504/article/details/152175150https://blog.csdn.net/majianxin1/article/details/102603380https://blog.csdn.net/weixin_39996605/article/details/148588071https://blog.csdn.net/2401_87398486/article/details/151581727https://cloud.tencent.com/developer/article/2298552https://blog.csdn.net/feiying101/article/details/138394427
版权声明:本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

北京门户网站网址做免费互动小游戏的网站

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容: 开发一个基于AI的Kiro下载工具,具备以下功能:1. 智能解析下载链接,自动识别最佳下载源;2. 动态调整下载速度,根据网络状况…

张小明 2025/12/26 5:08:01 网站建设

在西部数码上再备案一个网站ftp顶呱呱代理建设网站

1.hash取余算法 设有N个分⽚,使⽤[0,N-1]这样序号进⾏编号. 针对某个给定的key,先计算hash值,再把得到的结果%N,得到的结果即为分⽚编号. 举例:N为3.给定key为hello,对hello计算hash值(⽐如使⽤md5算法),得到的结果为bc4b2a76b9719d91 ,再把这个结果%3,结果为0,那么…

张小明 2025/12/25 11:14:40 网站建设

网站空间服务站电话网站常用的蓝色

PyFluent自动化仿真:从手动操作到智能工程的范式转变 【免费下载链接】pyfluent 项目地址: https://gitcode.com/gh_mirrors/pyf/pyfluent 在传统的CFD仿真工作流中,工程师往往需要花费大量时间在重复性的GUI操作上:点击菜单、设置参…

张小明 2025/12/26 4:42:18 网站建设

奉贤网站建设公司html5网站开发需要框架吗

在使用 Flink SQL 进行实时数据处理的过程中,双流 Join 是非常常见的操作之一。典型的场景包括分析广告效果(曝光流订单流实时关联)、实时推荐(点击流和商品信息)等等。然而,双流 Join 需要在状态中维护两侧…

张小明 2025/12/25 15:43:21 网站建设

建设电子商务网站的基本步骤织梦dede建站教程视频

技术干货与开源许可知识整合 1. LDAP Account Manager(LAM)相关 LAM 是一款实用的管理工具,但它也有一些可能会让用户感到困扰的地方。例如,LAM 不允许创建包含大写字符或空格的 Windows 用户和组账户,尽管底层的 UNIX/Linux 操作系统处理这些字符可能并无问题。由于在默…

张小明 2025/12/25 12:16:00 网站建设

滨州做网站的公司可以做业务推广的网站有哪些内容

ComfyUI与GitHub Actions集成:自动化测试与部署 在AI生成内容(AIGC)迅速普及的今天,越来越多开发者和创意团队开始依赖Stable Diffusion等模型进行图像、视频乃至交互式内容的生产。然而,随着工作流日益复杂——从文本…

张小明 2025/12/25 11:50:41 网站建设