ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

什么是死锁?

2019-10-16 19:53:48  阅读:213  来源: 互联网

标签:Thread 什么 System 死锁 线程 println o2 o1


线程死锁是指由于两个或者多个线程互相持有所需要的资源,导致这些线程一直处于等待其他线程释放资源的状态,无法前往执行,如果线程都不主动释放所占有的资源,将产生死锁。

当线程处于这种僵持状态时,若无外力作用,它们都将无法再向前推进。

 

产生原因:

  • 持有系统不可剥夺资源,去竞争其他已被占用的系统不可剥夺资源,形成程序僵死的竞争关系。
  • 持有资源的锁,去竞争锁已被占用的其他资源,形成程序僵死的争关系。
  • 信号量使用不当。

...

 

如线程A占有资源 1 的锁,去竞争资源 2 的锁;线程 B 占有资源 2 的锁,去竞争资源1的锁。

代码表现如下

package constxiong.concurrency.a022;

/**
 * 测试死锁
 * @author ConstXiong
 * @date 2019-09-23 19:28:23
 */
public class TestDeadLock {
     
    final static Object o1 = new Object();
    
    final static Object o2 = new Object();
    
    public static void main(String[] args) {
        //先持有 o1 的锁,再去获取 o2 的锁
        Thread t1 = new Thread() {
            
            @Override
            public void run() {
                synchronized (o1) {
                    System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o1 对象的锁");
                    try {
                        System.out.println("休眠1秒");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o2 对象的锁");
                    synchronized (o2) {
                        System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o2 对象的锁");
                    }
                }
            }
            
        };
        
        //先持有 o2 的锁,再去获取 o1 的锁
        Thread t2 = new Thread() {
            
            @Override
            public void run() {
                synchronized (o2) {
                    System.out.println("线程:" + Thread.currentThread().getName() + " 获取到 o2 对象的锁");
                    try {
                        System.out.println("休眠1秒");
                        Thread.sleep(1000);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    
                    System.out.println("线程:" + Thread.currentThread().getName() + " 去获取 o1 对象的锁");
                    synchronized (o1) {
                        System.out.println("线程:" + Thread.currentThread().getName() + " 成功获取 o1 对象的锁");
                    }
                }
            }
            
        };
        
        
        t1.start();
        t2.start();
    }
    
}

 

 

测试结果,发生死锁,打印如下

线程:Thread-0 获取到 o1 对象的锁
休眠1秒
线程:Thread-1 获取到 o2 对象的锁
休眠1秒
线程:Thread-1 去获取 o1 对象的锁
线程:Thread-0 去获取 o2 对象的锁

 

       


Java面试题汇总,总有一道卡住你!

 

标签:Thread,什么,System,死锁,线程,println,o2,o1
来源: https://www.cnblogs.com/ConstXiong/p/11687984.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有