zoukankan      html  css  js  c++  java
  • 线程3-线程死锁

    1、死锁原因

    (1)死锁问题处理线程同步时需要处理
    (2)不同的线程分别占用对方需要的资源不放弃,都在等待对方先释放自己需要的同步资源,就造成了线程死锁
    (3)当线程执行完代码后,或者执行过程中发生异常时,线程会释放对象锁

    2、死锁例子

    package com.thread.test;
    //死锁问题处理线程同步时需要处理
    //不同的线程分别占用对方需要的资源不放弃,都在等待对方先释放自己需要的同步资源,就造成了线程死锁
    class DeatThreadTest implements Runnable {
        StringBuffer sbr = new StringBuffer();
        Object obj1 = new Object();
        Object obj2 = new Object();
    
        @Override
        public void run() {
            synchronized (obj1) {
                sbr.append("A");
                Thread.currentThread();
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(sbr);
                synchronized (obj2) {
                    sbr.append("B");
                    System.out.println(sbr);
                }
            }
    
            synchronized (obj2) {
                sbr.append("C");
                Thread.currentThread();
                try {
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                System.out.println(sbr);
                synchronized (obj1) {
                    sbr.append("D");
                    System.out.println(sbr);
                }
            }
        }
    
    }
    
    public class DeadThread {
    
        public static void main(String[] args) {
            DeatThreadTest dtt = new DeatThreadTest();
    
            Thread t1 = new Thread(dtt);
            Thread t2 = new Thread(dtt);
            
            t1.start();
            t2.start();
            
            //当线程1启动后,先拿到obj1的锁
            //在线程1沉睡时,这时线程2先拿到obj2的对象锁
            //此时,线程1等待线程2释放obj2的对象锁,线程2等待线程1释放obj1的对象锁,导致死锁
        }
    
    }
  • 相关阅读:
    基于接口而非实现编程 和 依赖注入
    程序出错该返回啥?
    js关于for循环实现线程休眠效果的问题
    预祝1024节日快乐!
    20201101_Python的虚拟环境问题
    机器学习——dbscan密度聚类
    公司里使用gitlab管理项目
    MYSQL集群MHA架构实现手册
    vbox导入虚拟电脑网卡MAC问题,MacOS 通过virtualbox安装的centos7虚拟机不能上网解决
    MySQL误操作后如何快速回滚(转)
  • 原文地址:https://www.cnblogs.com/fubaizhaizhuren/p/5066537.html
Copyright © 2011-2022 走看看