• 多线程系列教材 (五)- 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

  • 相关阅读:

    泛型
    特性
    2.Linux基础入门
    1.Linux介绍及系统安装
    php十七种设计模式适用场合总结
    转载zendframework 插件方式
    常用的Jquery代码片段,没事的时候研究一下
    Zend Framework1.9 模块化搭建
    PHP的设计模式总结命令链模式
  • 原文地址:https://www.cnblogs.com/Lanht/p/12615474.html
Copyright © 2020-2023  润新知