资讯动态

【JUC】死锁

发布时间:2026/10/14 4:33:36 来源:尧图企业网站定制
Java 多线程中的死锁Deadlock是两个或多个线程在执行过程中因争夺资源而造成的一种互相等待的僵局。如果没有外力干涉这些线程都无法继续执行。下面从产生条件、代码示例、排查方法、预防策略几个方面来讲。一、死锁产生的四个必要条件死锁必须同时满足以下四个条件缺一不可互斥条件资源同一时刻只能被一个线程占用。请求与保持条件线程已经持有了至少一个资源又去请求被其他线程占用的资源且不释放自己已持有的资源。不可剥夺条件线程已获得的资源在使用完之前不能被其他线程强行剥夺只能自己释放。循环等待条件多个线程之间形成一种头尾相接的循环等待资源关系。破坏其中任意一个条件就能避免死锁。二、经典代码示例publicclassDeadLockDemo{privatestaticfinalObjectlockAnewObject();privatestaticfinalObjectlockBnewObject();publicstaticvoidmain(String[]args){Threadt1newThread(()-{synchronized(lockA){System.out.println(线程1 获取 lockA);try{Thread.sleep(100);}catch(InterruptedExceptione){}synchronized(lockB){System.out.println(线程1 获取 lockB);}}});Threadt2newThread(()-{synchronized(lockB){System.out.println(线程2 获取 lockB);try{Thread.sleep(100);}catch(InterruptedExceptione){}synchronized(lockA){System.out.println(线程2 获取 lockA);}}});t1.start();t2.start();}}线程1 持有 lockA等待 lockB线程2 持有 lockB等待 lockA两者互相等待形成循环等待程序卡死。三、如何排查死锁1. 使用jstackjstackpid输出中会看到Found one Java-level deadlock:并列出涉及死锁的线程和持有的锁。2. 使用jconsole/VisualVM图形化工具连接进程后可以检测到死锁线程。3. 使用ThreadMXBean编程检测ThreadMXBeanmxBeanManagementFactory.getThreadMXBean();long[]deadlockedThreadsmxBean.findDeadlockedThreads();if(deadlockedThreads!null){ThreadInfo[]infosmxBean.getThreadInfo(deadlockedThreads);for(ThreadInfoinfo:infos){System.out.println(info);}}四、预防与避免策略1. 破坏循环等待条件最常用统一加锁顺序所有线程都按相同的顺序获取锁。// 所有线程都先 lockA 再 lockBsynchronized(lockA){synchronized(lockB){...}}2. 破坏请求与保持条件一次性申请所有资源或者申请新资源前先释放已持有的资源。3. 破坏不可剥夺条件使用ReentrantLock.tryLock(long timeout, TimeUnit)超时拿不到锁就放弃并释放已持有的锁。if(lockA.tryLock(1,TimeUnit.SECONDS)){try{if(lockB.tryLock(1,TimeUnit.SECONDS)){try{/* 业务逻辑 */}finally{lockB.unlock();}}}finally{lockA.unlock();}}4. 破坏互斥条件一般很难破坏因为很多资源本身就是互斥的。可以考虑用无锁结构CAS、原子类或读写锁来减少互斥范围。5. 其他工程实践减小锁粒度缩短持锁时间避免锁嵌套使用java.util.concurrent包中的并发工具类如ConcurrentHashMap、Semaphore替代手动加锁使用带超时的锁避免无限等待。五、死锁 vs 活锁 vs 饥饿概念说明死锁线程互相等待永远阻塞活锁线程不断重试、不断改变状态但无法向前推进饥饿某线程长期得不到资源如优先级太低六、小结死锁的本质是循环等待 不可剥夺排查靠jstack、jconsole、ThreadMXBean预防核心是统一加锁顺序和使用带超时的锁工程上更推荐用JUC提供的高级并发工具减少手动锁的使用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑