当前位置: 首页 > wzjs >正文

手机智能建网站博客网站开发

手机智能建网站,博客网站开发,wordpress如何打开,怎么自己做一个网站平台什么是死锁 死锁(Deadlock) 是指两个或多个线程在运行过程中,由于争夺资源而造成一种相互等待的现象,导致它们都无法继续执行。 死锁通常发生在多线程程序中,当多个线程都试图获取对方持有的资源时,就可能陷…

什么是死锁

死锁(Deadlock) 是指两个或多个线程在运行过程中,由于争夺资源而造成一种相互等待的现象,导致它们都无法继续执行。
死锁通常发生在多线程程序中,当多个线程都试图获取对方持有的资源时,就可能陷入“你等我,我等你”的状态,程序因此进入僵局。

在 Java 中,死锁多见于同时持有多把锁的场景,例如使用 synchronizedReentrantLock 时多个线程互相抢占资源。


死锁实例代码

public class DeadlockDemo {private final Object lock1 = new Object();private final Object lock2 = new Object();public void thread1() {synchronized (lock1) {System.out.println("Thread1: 持有lock1");try { Thread.sleep(50); } catch (InterruptedException e) {}synchronized (lock2) {System.out.println("Thread1: 持有lock1和lock2");}}}public void thread2() {synchronized (lock2) {System.out.println("Thread2: 持有lock2");try { Thread.sleep(50); } catch (InterruptedException e) {}synchronized (lock1) {System.out.println("Thread2: 持有lock2和lock1");}}}public static void main(String[] args) {DeadlockDemo demo = new DeadlockDemo();new Thread(demo::thread1).start();new Thread(demo::thread2).start();}
}两个线程互相等待对方的锁,导致程序死锁。

死锁产生的四个必要条件

死锁(Deadlock)是一种 多个线程或进程互相占有资源、相互等待,导致都无法继续运行的状态。
它必须同时满足这4个条件:


1. 互斥条件(Mutual Exclusion)

  • 解释

    • 某个资源在同一时间只能被一个线程占用
    • 其他线程只能等待该资源被释放后才能访问。
    • 例如:两个线程都想打印日志,但打印机只有一个。
  • Java 中的体现

    • synchronized 块、ReentrantLock、文件句柄等都是互斥资源。
  • 打破策略

    • 共享资源:如果可以让多个线程“共享读”,可以用 读写锁ReentrantReadWriteLock),允许多个线程同时读。
    • 无锁化:用 CAS (Compare-And-Swap) 这种原子操作替代锁,比如 Java 的 AtomicInteger
    • 乐观并发:像数据库的乐观锁一样,认为冲突很少发生,先不加锁,冲突时再回滚。

2. 请求与保持条件(Request and Maintain)

  • 解释

    • 线程 已经持有一个资源,但它还想申请其他资源,而且在申请新资源的同时不释放已持有的资源
    • 例如:线程 A 拿着资源 X,要资源 Y;线程 B 拿着资源 Y,要资源 X。
  • Java 中的体现

    • 线程拿到一把锁后继续申请另一把锁,比如:

      synchronized (lock1) {synchronized (lock2) {// ...}
      }
      
  • 打破策略

    • 一次性申请所有资源
      让线程在执行前先申请所需的所有锁,如果申请失败就释放已拿到的资源,稍后重试。

    • 使用 tryLock + 超时策略

      if (lock1.tryLock(1, TimeUnit.SECONDS)) {try {if (lock2.tryLock(1, TimeUnit.SECONDS)) {try {// 临界区} finally {lock2.unlock();}} else {// 获取 lock2 失败,释放 lock1}} finally {lock1.unlock();}
      }
      

      不等待另一把锁,避免死等。


3. 不可剥夺条件(No Preemption)

  • 解释

    • 线程 已获得的资源,在没使用完之前,不能被系统强制剥夺,只能自己释放。
    • 例如:一个线程占用数据库连接,其他线程只能等它手动释放。
  • Java 中的体现

    • synchronized 和普通 ReentrantLock 都是不可剥夺的。
    • 一旦线程拿到锁,其他线程只能一直等。
  • 打破策略

    • 使用可中断锁
      lockInterruptibly(),如果线程被中断,可以及时退出等待。

      lock.lockInterruptibly();
      
    • 超时锁
      tryLock(timeout),避免无限等待。

    • 强制回滚(在事务/数据库层实现):如果一个线程长期占用资源,其他线程可以中断它,让其释放资源。


4. 循环等待条件(Circular Wait)

  • 解释

    • 存在一个线程等待环,每个线程都在等待下一个线程释放资源。

    • 例如:

      T1: 持有 lockA,等待 lockB
      T2: 持有 lockB,等待 lockA
      
  • Java 中的体现

    • 多线程同时请求多把锁,但获取锁的顺序不同
  • 打破策略

    • 规定固定的锁获取顺序
      所有线程必须按照统一顺序申请锁,例如根据对象 ID 排序:

      Object lockA, lockB;Object first = lockA.hashCode() < lockB.hashCode() ? lockA : lockB;
      Object second = lockA.hashCode() < lockB.hashCode() ? lockB : lockA;synchronized (first) {synchronized (second) {// 临界区}
      }
      

      这样避免了 T1、T2 拿锁顺序不一致导致的环。

    • 资源分级法
      给资源编号,只允许线程按编号递增顺序申请。


如何打破死锁的四个必要条件

要避免死锁,必须破坏至少一个必要条件,具体方法如下:

条件解释打破方法
互斥资源一次只能被一个线程占用使用无锁算法(如 CAS)、读写锁(允许多线程共享读)
占有且等待已占有资源的线程等待其他资源时不释放已有资源一次申请所有资源;使用 tryLock 获取失败时释放已有资源并重试
不可剥夺已获得的资源不能被强制剥夺使用 lockInterruptibly()tryLock(timeout),支持超时退出和中断
循环等待存在线程资源等待环规定统一的资源申请顺序(如按资源 ID 排序),防止线程形成资源等待环

在这里插入图片描述

如何排查死锁

在 Java 中,死锁的排查可以采用以下几种方法:

1. 使用 jstack 工具

  1. 通过 jps -l 获取 Java 进程 PID。
  2. 执行 jstack <PID> 导出线程堆栈信息。
  3. 搜索 Found one Java-level deadlock: 判断是否发生死锁。
    在这里插入图片描述

2. 使用 ThreadMXBean API

可以在程序中引入检测逻辑:

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;
import java.lang.management.ThreadInfo;public class DeadlockChecker {public static void main(String[] args) {ThreadMXBean threadBean = ManagementFactory.getThreadMXBean();long[] deadlockedThreads = threadBean.findDeadlockedThreads();if (deadlockedThreads != null) {ThreadInfo[] infos = threadBean.getThreadInfo(deadlockedThreads);for (ThreadInfo info : infos) {System.out.println("发现死锁线程: " + info.getThreadName());}} else {System.out.println("未发现死锁");}}
}

3. 使用 IDE 工具

如 IntelliJ IDEA 调试时,可以在 Threads 面板查看线程状态,BLOCKED 的线程相互依赖时可能是死锁。


小结

死锁是多线程编程中的常见问题,理解其产生的四个条件及排查方法是关键。在实际开发中,建议使用超时锁、可中断锁、统一资源申请顺序等技术来避免死锁,从源头上降低风险。


必要条件/充分条件

必要条件(necessary condition)
如果 没有 A,那就一定没有 B。
换句话说:A 不成立 → B 不成立
但:A 成立 ≠ B 一定成立
类比:
空气是人活着的必要条件
没空气 → 人活不了
有空气 ≠ 人一定活着(还需要水、食物等)

充分条件(sufficient condition)
如果 有 A,那就一定有 B。
换句话说:A 成立 → B 一定成立
但:B 成立 ≠ A 一定成立
类比:
“下大雨”是“地面湿” 的充分条件
下大雨 → 地面必湿
地面湿 ≠ 一定是下雨(可能是洒水车路过)


文章转载自:

http://25JI84jC.trwkz.cn
http://y2OFPd5d.trwkz.cn
http://PJqfcQt3.trwkz.cn
http://GKlzZl9Y.trwkz.cn
http://8O1ocZPh.trwkz.cn
http://j40tOn7o.trwkz.cn
http://CLviwwMq.trwkz.cn
http://ATYZvZ4U.trwkz.cn
http://vjB7bHTw.trwkz.cn
http://CsviYKLm.trwkz.cn
http://XUTf4RW2.trwkz.cn
http://mOILsH8l.trwkz.cn
http://WXwnjEUu.trwkz.cn
http://D46E3lsQ.trwkz.cn
http://I9PO6tyi.trwkz.cn
http://XI65xZxv.trwkz.cn
http://0UoeUwkT.trwkz.cn
http://jRIdZGbs.trwkz.cn
http://Oz9Mhofk.trwkz.cn
http://xISqqpkt.trwkz.cn
http://yER63gl5.trwkz.cn
http://cxmUn3Zi.trwkz.cn
http://vqkLAD3R.trwkz.cn
http://cZYZhhg4.trwkz.cn
http://KiBkcR2Z.trwkz.cn
http://xcJ6Q8zO.trwkz.cn
http://xw8Lw1YL.trwkz.cn
http://3Qzu0n1L.trwkz.cn
http://QQdMSmo6.trwkz.cn
http://tHYFbTqJ.trwkz.cn
http://www.dtcms.com/wzjs/772193.html

相关文章:

  • 专业做装修的网站中国工业设计公司排名前十强
  • 易优建站系部网站建设方案
  • 天涯网站怎么做外链做app和网站怎样
  • 建筑施工单位网站网站开发需求大厅
  • 网站建设厘金手指下拉15黄页网址18岁以下勿入免费
  • 江西建设三类人员网站合肥装饰公司做的好的网站
  • 地方网站方案百度图片搜索
  • 西昌市规划建设局网站建立网站买空间哪家好
  • 海外产品网站建设photoshop制作网站
  • 东莞制作网站公司淘宝联盟上怎么建设网站
  • 中英文切换网站模板广州做网站好的公司
  • 温州优化网站临沂科技网站建设
  • 建立机制昆明网站排名优化报价
  • 哪个网站做h5号住房城乡建设部
  • 乐清网站开发天津做网站比较大的公司
  • 南宁网站建设哪家公司实力强学校网站网页设计
  • 京东做代码的网站吗做任务 网站
  • 网站建设教学大纲莱州木籽网络科技有限公司
  • 学校展示型网站建设方案书快速学做网站
  • 宇说建筑网站贵州企业网站建设设计
  • 网站建设模块方案书免费空间域名注册免备案
  • 南宁机关两学一做网站上海网站优化公司排名
  • 怎样看网站是谁做的软件制作专业
  • 做厂房的网站个人网站域名取名
  • 网站链接 动态图怎么做免费pc网站建设
  • 西安企业黄页网站猪八戒小程序开发报价
  • 网站建设 招聘阿里巴巴可以做网站吗
  • 电子商务网站建设与管理项目计划书手机网站怎么导入微信朋友圈
  • 做有搜索功能的网站北京视频直播网站建设
  • 免费网站素材下载齐齐哈尔建设局网站首页