首页 > 其他分享 >死锁

死锁

时间:2024-12-22 18:11:00浏览次数:3  
标签:lockB lang lockA java String Thread 死锁

死锁是指两个或者两个以上的线程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力干涉那么它们都将无法推进下去

模拟死锁

class HoldLockThread extends Thread {

    private String lockA;
    private String lockB;

    public HoldLockThread(String lockA, String lockB) {
        this.lockA = lockA;
        this.lockB = lockB;
    }

    @Override
    public void run() {
        synchronized (lockA) {
            System.out.println("线程" + Thread.currentThread().getName() + "持有锁" + lockA + ",尝试获取锁" + lockB);
            try {
                TimeUnit.SECONDS.sleep(2);
            } catch (Exception e) {
                e.printStackTrace();
            }
            synchronized (lockB) {
                System.out.println("线程" + Thread.currentThread().getName() + "持有锁" + lockB);
            }
        }
    }
}

public class DeadLockDemo {
    public static void main(String[] args) {
        String lockA = "lockA";
        String lockB = "lockB";
        new Thread(new HoldLockThread(lockA, lockB), "A").start();
        new Thread(new HoldLockThread(lockB, lockA), "B").start();
    }
}

 如何定位死锁问题?

1、先通过jps命令找到java进程pid

22208 Launcher
22209 DeadLockDemo
75993 
22570 Jps

2、运行jstack pid,会自动识别可能的死锁

Found one Java-level deadlock:
=============================
"B":
  waiting to lock monitor 0x00007fca8f813f68 (object 0x000000076accf6b0, a java.lang.String),
  which is held by "A"
"A":
  waiting to lock monitor 0x00007fca8f816958 (object 0x000000076accf6e8, a java.lang.String),
  which is held by "B"

Java stack information for the threads listed above:
===================================================
"B":
        at com.study.demo.HoldLockThread.run(DeadLockDemo.java:25)
        - waiting to lock <0x000000076accf6b0> (a java.lang.String)
        - locked <0x000000076accf6e8> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:748)
"A":
        at com.study.demo.HoldLockThread.run(DeadLockDemo.java:25)
        - waiting to lock <0x000000076accf6e8> (a java.lang.String)
        - locked <0x000000076accf6b0> (a java.lang.String)
        at java.lang.Thread.run(Thread.java:748)

Found 1 deadlock.

标签:lockB,lang,lockA,java,String,Thread,死锁
From: https://www.cnblogs.com/damour-damocles/p/18608278

相关文章

  • c++死锁调试 ,gdb pstack
    psatck‌pstack命令‌是一个在Linux系统中用于查看进程堆栈信息的工具。写了一个服务端死锁程序,如下:#include<iostream>#include<thread>#include<mutex>#include<chrono>#include<sys/socket.h>#include<netinet/in.h>#include<unistd.h>#......
  • 不可重入锁与死锁
    不可重入锁确实可能导致死锁,特别是在同一线程尝试多次获取同一把锁时。如果锁是不可重入的,那么线程在第二次尝试获取锁时会永远阻塞,从而导致死锁。不可重入锁与死锁的关系不可重入锁不允许同一个线程多次获取同一把锁。在以下情况下,这种限制会导致死锁:递归调用时:如果一......
  • MySQL死锁成因及解决方案
    1.死锁的发生1.1什么是死锁?        死锁是指两个或多个事务在并发执行时,因为资源互相占用而进入一种无限等待的状态,导致无法继续执行的现象。例如:事务A持有资源1,同时请求资源2。事务B持有资源2,同时请求资源1。两者互相等待对方释放资源,最终导致死锁。1.2死锁......
  • MySQL 中如果发生死锁应该如何解决?
    MySQL中如果发生死锁应该如何解决?死锁是指多个事务在执行过程中因资源争用形成的循环等待,导致无法继续执行。MySQL会自动检测死锁并选择一个事务进行回滚,但我们可以通过优化设计和操作来避免和解决死锁问题。1.MySQL如何检测死锁?死锁检测:MySQL的InnoDB存储引擎会维护......
  • MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
    对于UPDATE、DELETE、INSERT语句,InnoDB会自动给涉及数据集加排他锁(X)。而MyISAM在执行查询语句SELECT前,会自动给涉及的所有表加读锁,在执行增、删、改操作前,会自动给涉及的表加写锁,这个过程并不需要我们去手动操作。那么在特定情况下,我们该如何去加锁呢?下面咱们来认真的......
  • 操作系统中的死锁
    什么是死锁一组进程中的每一个进程都在等待仅由该组进程中其他进程才能引发的事件,这样就形成死锁了。死锁的原因竞争不可抢占的资源竞争可消耗资源进程推进顺序不当死锁产生的必要条件1.互斥条件:对资源互斥访问2.请求和保持:进程已经拥有了一个资源,还需要拥有其他资源,此......
  • 《Java核心技术I》死锁
    死锁账户1:200元账户2:300元线程1:从账号1转300到账户2线程2:从账户2转400到账户1如上,线程1和线程2显然都被阻塞,两个账户的余额都不足以转账,两个线程都无法执行下去。有可能会因为每一个线程要等待更多的钱款存入而导致所有线程都被阻塞,这样的状态称为死锁(deadlock)。通俗的......
  • SQL SERVER死锁查询,死锁分析,解锁,查询占用
    From:  https://www.cnblogs.com/K-R-/p/18431639简单点的处理方法:1、查询死锁的表selectrequest_session_idspid,OBJECT_NAME(resource_associated_entity_id)tableNamefromsys.dm_tran_lockswhereresource_type='OBJECT'2、解锁declare@spidintSet@spid=......
  • 多线程(五):死锁&内存可见性问题
    目录1.synchronized---监视器锁monitorlock2.死锁2.1死锁---情况12.1.1可重入2.1.2 如何实现一个可重入锁[面试题]2.2死锁---情况22.2.1BLOCKED2.2.2手写死锁代码[经典面试题]2.3 死锁---情况33.避免死锁的出现3.1构成死锁的四个必要条件★......
  • 【JavaEE】【多线程】synchronized和死锁
    目录一、synchronized详解1.1互斥1.2可重入二、死锁2.1死锁成因2.2避免死锁一、synchronized详解1.1互斥synchronized会起到互斥效果,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象synchronized就会阻塞等待.语法:sy......