zoukankan      html  css  js  c++  java
  • 多线程系列教材 (五)- Java 演示多线程死锁

    当业务比较复杂,多线程应用里有可能会发生死锁

    步骤1:演示死锁
    步骤2:练习-死锁
    步骤3:答案-死锁

    步骤 1 : 演示死锁

    1. 线程1 首先占有对象1,接着试图占有对象2
    2. 线程2 首先占有对象2,接着试图占有对象1
    3. 线程1 等待线程2释放对象2
    4. 与此同时,线程2等待线程1释放对象1
    就会。。。一直等待下去,直到天荒地老,海枯石烂,山无棱 ,天地合。。。

    演示死锁

    package multiplethread;

       

    import charactor.Hero;

        

    public class TestThread {

          

        public static void main(String[] args) {

            final Hero ahri = new Hero();

            ahri.name = "九尾妖狐";

            final Hero annie = new Hero();

            annie.name = "安妮";

             

            Thread t1 = new Thread(){

                public void run(){

                    //占有九尾妖狐

                    synchronized (ahri) {

                        System.out.println("t1 已占有九尾妖狐");

                        try {

                            //停顿1000毫秒,另一个线程有足够的时间占有安妮

                            Thread.sleep(1000);

                        catch (InterruptedException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                        }

                         

                        System.out.println("t1 试图占有安妮");

                        System.out.println("t1 等待中 。。。。");

                        synchronized (annie) {

                            System.out.println("do something");

                        }

                    }   

                     

                }

            };

            t1.start();

            Thread t2 = new Thread(){

                public void run(){

                    //占有安妮

                    synchronized (annie) {

                        System.out.println("t2 已占有安妮");

                        try {

                             

                            //停顿1000毫秒,另一个线程有足够的时间占有暂用九尾妖狐

                            Thread.sleep(1000);

                        catch (InterruptedException e) {

                            // TODO Auto-generated catch block

                            e.printStackTrace();

                        }

                        System.out.println("t2 试图占有九尾妖狐");

                        System.out.println("t2 等待中 。。。。");

                        synchronized (ahri) {

                            System.out.println("do something");

                        }

                    }   

                     

                }

            };

            t2.start();

       }

            

    }


    更多内容,点击了解: https://how2j.cn/k/thread/thread-deadlock/356.html

  • 相关阅读:
    C#(64位系统) 解决"未能加载文件或程序集,或它的某一个依赖项..."
    C#匿名方法与Delegate类型转换错误
    记录C#错误日志工具
    C# 引用访问权限,很多老手都不懂
    .NET基础之自定义泛型
    C# Socket学习笔记一
    .Net垃圾收集机制—了解算法与代龄
    审计系统---堡垒机项目之环境准备
    审计系统---堡垒机项目之表结构设计
    审计系统---堡垒机python下ssh的使用
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615474.html
Copyright © 2011-2022 走看看