首页 > 其他分享 >死锁(deadlock)

死锁(deadlock)

时间:2023-03-30 15:14:02浏览次数:30  
标签:Thread println 死锁 线程 进程 deadlock public

线程死锁的必备要素

  • 互斥条件:进程要求对所分配的资源进行排他性控制,即在一段时间内某资源仅为一个进程所占有。此时若有其他进程请求该资源,则请求进程只能等待;
  • 不可剥夺条件:进程所获得的资源在未使用完毕之前,不能被其他进程强行夺走,即只能由获得该资源的进程自己来释放(只能是主动释放,如 yield 释放 CPU 执行权);
  • 请求与保持条件:进程已经保持了至少一个资源,但又提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放;
  • 循环等待条件:指在发生死锁时,必然存在一个线程请求资源的环形链,即线程集合 {T0,T1,T2,…Tn}中的 T0 正在等待一个 T1 占用的资源,T1 正在等待 T2 占用的资源,以此类推,Tn 正在等待己被 T0 占用的资源。

死锁的实现

/**
 * @author wsy
 */
public class DeadLockDemo {
    public static  Object objectA = new Object();
    public static  Object objectB = new Object();


    public static void main(String[] args) {

        Thread thread1 = new Thread(new Runnable() {

            @Override
            public void run() {
                sysObjectA();
            }
        });

        Thread thread2 = new Thread(new Runnable() {

            @Override
            public void run() {
                sysObjectB();

            }
        });
        thread1.start();
        thread2.start();

    }

    public static void sysObjectA() {
        synchronized (objectA) {
            System.out.println(Thread.currentThread().getName() + "线程持有锁A");
            System.out.println(Thread.currentThread().getName() + "申请锁B");
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            synchronized (objectB) {
                System.out.println(Thread.currentThread().getName() + "线程持有锁B");
            }
        }
    }

    public static void sysObjectB() {
        synchronized (objectB) {
            System.out.println(Thread.currentThread().getName() + "线程持有锁B");
            System.out.println(Thread.currentThread().getName() + "申请锁A");
            try {
                Thread.sleep(200);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

            synchronized (objectA) {
                System.out.println(Thread.currentThread().getName() + "线程持有锁A");
            }
        }
    }

}

 

死锁排查

输入jps查出当前运行的java进程号码

 

 使用jstack+进程号码现实堆栈信息

 

 

 

标签:Thread,println,死锁,线程,进程,deadlock,public
From: https://www.cnblogs.com/shaoyongwang/p/17272748.html

相关文章

  • 什么是线程死锁
    死锁是指两个或两个以上的进程(线程)在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。此时称系统处于死锁状态或系统产......
  • 死锁
    四个必要条件(1)互斥条件:进程对所分配到的资源不允许其他进程访问,若其他进程访问,只能等待,直到进程使用完成后释放该资源;(2)请求保持条件:进程获得一定资源后,又对其他资源发出......
  • mysql查看死锁
    查看死锁Mysql查询是否存在锁表有多种方式,这里只介绍一种最常用的。1、查看正在进行中的事务SELECT*FROMinformation_schema.INNODB_TRX2、查看正在锁的事务......
  • 死锁产生的原因及避免死锁的方法
    死锁产生的原因:两个进程都拿着对方需要的资源不放,而形成相互等待。如果不同程序会并发存取多个表/资源,尽量约定以相同的顺序访问表/资源,可以大大降低发生死锁的可能性......
  • 死锁
    死锁死锁怎么产生的两个或多个线程,互相拥有对方需要的资源,又互相抢占对方的资源,又不肯释放自己的资源,这就造成了死锁。java中怎么造成死锁的出现了锁的嵌套,解决办法就......
  • MySql 死锁
    MySql死锁一、什么是死锁InnoDB存储引擎定义了四种类型的行锁隔离等级对加锁的影响当前数据对加锁的影响二、为什么会形成死锁两阶段锁协议产生死锁的四个必要条件三、MySQ......
  • 死锁的四个必要条件以及处理策略
    一、什么是死锁死锁是指两个或两个以上的进程(线程)在运行过程中因争夺资源而造成的一种僵局。例如,某计算机系统中只有一台打印机和一台输入设备,进程P1正占用输入设备,同时......
  • JUC——什么是线程死锁?如何避免死锁?
      下面通过一个例子来说明线程死锁,代码模拟了上图的死锁的情况(代码来源于《并发编程之美》):publicclassDeadLockDemo{privatestaticObjectresource1=......
  • [MySql] 数据库死锁的排查和相关知识
    查看数据库最近的一次死锁执行以下命令:showengineinnodbstatus;查询结果......------------------------LATESTDETECTEDDEADLOCK------------------------2......
  • 死锁排查
    1.执行死锁代码publicclassDeadLockTest{publicstaticvoidmain(String[]args)throwsInterruptedException{//a线程持有a锁,并尝试获取b锁;b线程持......