做巧克力的网站字体大全100种
2026/6/9 22:20:13 网站建设 项目流程
做巧克力的网站,字体大全100种,WordPress动态icon标题,有什么网站可以做logo赚钱文章目录深入解析Java中的可重入锁ReentrantLock一、什么是ReentrantLock#xff1f;二、为什么要用ReentrantLock#xff1f;三、ReentrantLock的核心特性1. **可重入性**2. **公平性和非公平性**3. **锁的状态**四、ReentrantLock vs synchronized五、ReentrantLock的使用场…文章目录深入解析Java中的可重入锁ReentrantLock一、什么是ReentrantLock二、为什么要用ReentrantLock三、ReentrantLock的核心特性1. **可重入性**2. **公平性和非公平性**3. **锁的状态**四、ReentrantLock vs synchronized五、ReentrantLock的使用场景1. 高并发场景2. 公平性要求高的场景3. 需要可重入性的场景六、ReentrantLock的注意事项1. **避免死锁**2. **防止资源泄漏**3. **避免使用过多的锁**七、实战案例实现一个简单的银行转账案例描述实现代码分析八、总结希望这篇长文能帮助你更好地理解和使用ReentrantLock如果还有疑问或者想深入探讨的地方欢迎随时交流。 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把深入解析Java中的可重入锁ReentrantLock各位朋友们大家好闫工又来给大家讲技术了这次我们来聊一聊Java中一个非常重要的同步工具——ReentrantLock可重入锁。相信很多小伙伴在学习Java多线程的时候或多或少都听说过这个词。但是你真的搞懂它是什么、怎么用以及它的那些“小心机”吗别急闫工带着你们一步步深入手把手教会你一、什么是ReentrantLock首先让我们从基础开始。ReentrantLock是Java中一个非常强大的锁机制属于java.util.concurrent.locks包。它主要用于在多线程环境下控制对共享资源的访问避免多个线程同时修改或读取同一块数据时出现混乱。ReentrantLock的名字中有两个关键词Reentrant意思是“可重入”的表示同一个线程可以多次获取同一个锁。Lock当然就是锁的意思啦简单来说ReentrantLock就是一个能够被多个线程共享、并且支持公平与非公平模式的高级锁机制。二、为什么要用ReentrantLock在Java中默认的同步方式是synchronized关键字。虽然synchronized非常简单易用但它也有一些缺点粒度控制不够细无法实现更复杂的锁逻辑。性能问题在某些场景下synchronized的表现不如显式的锁机制。缺乏公平性支持默认情况下synchronized是不公平的。而ReentrantLock则弥补了这些不足。它提供了更多的灵活性和控制力比如支持可重入同一个线程可以多次加锁。可以选择公平或非公平的锁获取方式。提供条件队列Condition可以实现更复杂的同步逻辑。三、ReentrantLock的核心特性1.可重入性“可重入”是ReentrantLock的最大特色之一。它允许同一个线程多次获得同一个锁而不会出现死锁的情况。例如publicclassReentrantTest{privatefinalReentrantLocklocknewReentrantLock();publicvoidmethodA(){lock.lock();try{System.out.println(methodA acquire lock);methodB();}finally{lock.unlock();}}publicvoidmethodB(){lock.lock();try{System.out.println(methodB acquire lock);}finally{lock.unlock();}}publicstaticvoidmain(String[]args){ReentrantTesttestnewReentrantTest();test.methodA();}}在这个例子中methodA()调用了methodB()而两者都尝试获取同一个锁。如果没有可重入性第二次lock.lock()会阻塞甚至导致死锁。但ReentrantLock支持这一点所以程序可以正常运行。2.公平性和非公平性ReentrantLock有两个模式公平锁和非公平锁。默认情况下是非公平锁即先到的线程不一定能优先获取锁。非公平锁当一个线程尝试获取锁时如果锁是可用的则立即获得否则排队等待。公平锁严格按照线程到达的顺序来分配锁先进先得。可以通过构造函数指定模式// 非公平锁默认ReentrantLocklocknewReentrantLock();// 公平锁ReentrantLockfairLocknewReentrantLock(true);3.锁的状态ReentrantLock内部维护了一个计数器用来记录锁的重入次数。每次成功加锁计数器递增每次成功解锁计数器递减。publicclassLockState{privatefinalReentrantLocklocknewReentrantLock();publicvoidcheck(){System.out.println(Lock hold count: lock.getHoldCount());System.out.println(Number of waiting threads: lock.getQueueLength());}publicstaticvoidmain(String[]args){LockStatestatenewLockState();state.check();}}getHoldCount()返回当前线程对锁的持有次数而getQueueLength()返回正在等待获取该锁的线程数。四、ReentrantLock vs synchronized很多人可能会问既然有了synchronized为什么还要用ReentrantLock其实两者的区别还是挺大的特性ReentrantLocksynchronized可重入性支持不支持公平性选择可选公平/非公平无锁粒度控制更灵活较粗粒度性能在高并发场景下通常更优简单场景表现较好显式unlock()方法必须手动调用自动管理五、ReentrantLock的使用场景1. 高并发场景在高并发系统中ReentrantLock的性能和灵活性使其成为首选。例如热点数据的读写操作。复杂的业务逻辑需要更精细的锁控制。2. 公平性要求高的场景如果你需要严格的线程调度顺序比如银行转账中的排队可以使用公平锁。3. 需要可重入性的场景在方法嵌套调用中如果多个方法都需要加锁ReentrantLock的可重入性可以避免死锁问题。六、ReentrantLock的注意事项1.避免死锁虽然ReentrantLock支持可重入性但如果使用不当仍然可能导致死锁。例如publicclassDeadlock{privatefinalReentrantLocklockAnewReentrantLock();privatefinalReentrantLocklockBnewReentrantLock();publicvoidmethodA(){lockA.lock();try{// 一些操作methodB();}finally{lockA.unlock();}}publicvoidmethodB(){lockB.lock();try{// 一些操作methodA();}finally{lockB.unlock();}}}如果methodA()和methodB()同时持有锁可能会导致死锁。因此在设计锁的使用顺序时要格外小心。2.防止资源泄漏忘记释放锁会导致资源泄漏从而引发严重的问题。所以一定要在finally块中释放锁lock.lock();try{// 执行业务逻辑}finally{lock.unlock();}3.避免使用过多的锁虽然ReentrantLock功能强大但过度使用会导致系统性能下降。要合理设计锁的粒度尽量减少锁的持有时间。七、实战案例实现一个简单的银行转账为了让大家更好地理解ReentrantLock的应用场景我们来写一个小例子——银行转账。案例描述两个账户A和B各有一定金额。我们需要从A转100元到B并确保整个过程是线程安全的。实现代码publicclassBankTransfer{privatefinalReentrantLocklocknewReentrantLock();privateMapString,IntegeraccountsnewHashMap();publicBankTransfer(){accounts.put(A,1000);accounts.put(B,500);}publicvoidtransfer(Stringfrom,Stringto,intamount){lock.lock();try{if(accounts.get(from)amount){accounts.put(from,accounts.get(from)-amount);accounts.put(to,accounts.get(to)amount);System.out.println(Transfer completed. From: from, To: to, Amount: amount);}else{System.out.println(Insufficient balance in account from);}}finally{lock.unlock();}}publicstaticvoidmain(String[]args){BankTransfertransfernewBankTransfer();// 创建多个线程进行转账操作for(inti0;i5;i){finalintamount100;newThread(()-transfer.transfer(A,B,amount)).start();}}}分析我们使用ReentrantLock来保证转账操作的原子性。每次转账前先检查账户余额是否足够然后进行扣款和入账。使用finally块确保锁总是被释放。八、总结ReentrantLock是一个功能强大的锁工具支持可重入性和公平性选择。在高并发场景下它比synchronized更灵活且性能更好。使用时需要注意避免死锁和资源泄漏问题并合理设计锁的粒度。希望这篇长文能帮助你更好地理解和使用ReentrantLock如果还有疑问或者想深入探讨的地方欢迎随时交流。 领取 | 1000 套高质量面试题大合集无套路闫工带你飞一把成体系的面试题无论你是大佬还是小白都需要一套JAVA体系的面试题我已经上岸了你也想上岸吗闫工精心准备了程序准备面试想系统提升技术实力闫工精心整理了1000 套涵盖前端、后端、算法、数据库、操作系统、网络、设计模式等方向的面试真题 详细解析并附赠高频考点总结、简历模板、面经合集等实用资料✅ 覆盖大厂高频题型✅ 按知识点分类查漏补缺超方便✅ 持续更新助你拿下心仪 Offer免费领取 点击这里获取资料已帮助数千位开发者成功上岸下一个就是你✨

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

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

立即咨询