java多线程(5)死锁

news/2024/7/5 12:09:23 标签: java

上文讲到synchronized关键字在多线程中的使用,既然用到了锁,就会有出现死锁的情况。一个线程获得锁,如果其他线程也想获得同样的锁就会阻塞住,等待锁的释放。如果线程A已经获得锁1,还要获得锁2,同时线程B已经获得锁2,还要获得锁1,那么线程A和B就会一直阻塞住。

例子

依照惯例先举个例子:


public class Test {

    
    
    public static void main(String[] args) throws InterruptedException {
        Object lock1 = new Object();
        Object lock2 = new Object();
        Thread t1 = new Thread(new Test().new Tt1(lock1, lock2));
        Thread t2 = new Thread(new Test().new Tt2(lock1, lock2));
        t1.start();
        t2.start();
    }
    
    
    class Tt1 implements Runnable{

        private Object lock1;
        private Object lock2;
        
        public Tt1(Object lock1,Object lock2) {
            this.lock1 = lock1;
            this.lock2 = lock2;
        }

        @Override
        public void run() {
            
            synchronized (lock1) {
                System.out.println(this.getClass()+"-------1");
                try {
                    Thread.sleep(1000);
                    synchronized (lock2) {
                        System.out.println(this.getClass()+"-------2");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    
    class Tt2 implements Runnable{

        private Object lock1;
        private Object lock2;
        
        public Tt2(Object lock1,Object lock2) {
            this.lock1 = lock1;
            this.lock2 = lock2;
        }

        @Override
        public void run() {
            
            synchronized (lock2) {
                System.out.println(this.getClass()+"-------1");
                try {
                    Thread.sleep(1000);
                    synchronized (lock1) {
                        System.out.println(this.getClass()+"-------2");
                    }
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

执行结果:

class Test$Tt1-------1
class Test$Tt2-------1

2个线程都只执行到了第一步,就没有往下执行,都处于了阻塞状态,这就是死锁。

定位死锁

死锁问题并不是一个容易被发现和定位的问题,如果系统出现死锁问题,该如何定位?

1.使用jps,查询java虚拟机的pid
这里写图片描述
2.使用jstack打印堆栈
这里写图片描述

以Thread-1为例介绍下每一部分的意思
1).Thread-1 线程名称
2).prio=5 线程优先级
3).os_prio=0 本地的优先级
4).tid=0x000000001929b800 线程id
5).nid=0xfb34 本地的线程id
6)
java.lang.Thread.State: BLOCKED (on object monitor)
线程状态处于阻塞
7) waiting to lock <0x00000000d5dd0c38> (a java.lang.Object)正在等待的锁
8)locked <0x00000000d5dd0c48> (a java.lang.Object) 已获取的锁

现在我们可以看到Thread-1和Thread-0都处于阻塞状态,Thread-1获取了‘0x00000000d5dd0c48’锁,等待‘0x00000000d5dd0c38’锁,而Thread-0则刚好相反。

避免死锁

我们已经知道了死锁的形成和定位,再来讲讲如何避免:
1.尽量在线程中不嵌套获取多个资源,但你只需获取一个时就不会出现死锁、
2.如果不得不嵌套使用时,要多考虑嵌套的顺序
3.死锁是因为无限的阻塞等待,如果能有一个最大的等待时间就可以解决这个问题。synchronized不具备这个功能,但是我们可以使用Lock类中的tryLock方法去尝试获取锁,这个方法可以指定一个超时时限,在等待超过该时限之后返回失败信息


http://www.niftyadmin.cn/n/1476461.html

相关文章

2014年第五届蓝桥杯试题C/C++程序设计B组——史丰收速算

题目描述 史丰收速算法的革命性贡献是&#xff1a;从高位算起&#xff0c;预测进位。不需要九九表&#xff0c;彻底颠覆了传统手算! 速算的核心基础是&#xff1a;1位数乘以多位数的乘法。 其中&#xff0c;乘以7是最复杂的&#xff0c;就以它为例。 因为&#xff0c;1/7 是个循…

计算机vfp考试笔试试题,2009年9月计算机等级考试二级vfp笔试真题

一、每小题2分&#xff0c;共70分1、下列数据结构中.属于非线性结构的是A)循环队列B)带链队列C)二叉树D)带链栈2、下列数据结构中,能够按照“先进后出”原则存取数据的是A)循环队列B)栈C)队列D)s-叉树3、对于循环队列&#xff0c;下列叙述中正确的是A)队头指针是固定不变的B)队…

spring Ioc 控制

2019独角兽企业重金招聘Python工程师标准>>> 1.1 控制反转&#xff1a; 1.控制&#xff1a;传统Java SE程序设计&#xff0c;我们直接在对象内部通过new进行创建对象&#xff0c;是程序主动去创建依赖对象&#xff1b;而IoC是有专门一个容器来创建这些对象&#xf…

CF 103E Buying Sets 最大权闭合子图,匹配 难度:4

http://codeforces.com/problemset/problem/103/E 这道题首先一看就很像是最大权闭合子图,但是我们可以认为现在有两种点,数字和集合点,我们需要消除数字点的影响才能直接运用最大权闭合子图. 进行二分匹配,使得每个集合都唯一匹配一个数字,买下一个集合点,则意味着该集合中所有…

美国计算机考研难度排名,2019USnews美国大学研究生cs专业百强排名一览

一、美国大学研究生CS专业介绍美国计算机科学专业(Computer Science&#xff0c;简称CS)&#xff0c;是研究信息过程、用以表达此过程的信息结构和规则及其在信息处理系统中实现的学科。CS是一门包含各种各样与计算和信息处理相关主题的系统学科&#xff0c;从抽象的算法分析、…

python之路模块

time模块 1 print time.time()2 print time.mktime(time.localtime())3 4 print time.gmtime() #可加时间戳参数5 print time.localtime() #可加时间戳参数6 print time.strptime(2014-11-11, %Y-%m-%d)7 8 print time.strftime(%Y-%m-%d) #默认当前时间9 print time.st…

Git免输入密码提交

1、首先你需要下载 http://files.cnblogs.com/files/zhanqun/putty.7z 文件夹内包含下面这些文件&#xff1a; 2、然后点击PUTTYGEN.EXE文件 点击“Generate”并狂动鼠标生成密钥&#xff08;自己使用&#xff0c;建议不要设置Key passphrase),然后保存public key和private key…

win7计算机资源管理器卡住,Win7资源管理器未响应的解决方法

Win7系统是最多人在使用的一款系统了&#xff0c;但是在使用过程中也是会出现问题的。就拿资源管理器来说吧&#xff0c;有的时候会遇到资源管理器未响应&#xff0c;这的确是很烦人啊&#xff01;为什么会出现这样的问题呢&#xff1f;那既然出现了这样的问题要如何解决呢&…