zoukankan      html  css  js  c++  java
  • 演示线程的死锁问题

    /**
    * 演示线程的死锁问题
    *
    * 1.死锁的理解:不同的线程分别占用对方需要的同步资源不放弃,
    * 都在等待对方放弃自己需要的同步资源,就形成了线程的死锁
    *
    * 2.说明:
    * 1)出现死锁后,不会出现异常,不会出现提示,只是所有的线程都处于阻塞状态,无法继续
    * 2)我们使用同步时,要避免出现死锁。
    *
    * @author ch
    * @create 2021-02-15 下午 3:20
    */
    public class ThreadTest {
    
        public static void main(String[] args) {
    
            StringBuffer s1 = new StringBuffer();
            StringBuffer s2 = new StringBuffer();
    
    
            new Thread(){
                @Override
                public void run() {
    
                    synchronized (s1){
    
                        s1.append("a");
                        s2.append("1");
    
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
    
                        synchronized (s2){//互相僵持不下
                            s1.append("b");
                            s2.append("2");
    
                            System.out.println(s1);
                            System.out.println(s2);
                        }
    
    
                    }
    
                }
            }.start();
    
    
            new Thread(new Runnable() {
                @Override
                public void run() {
                    synchronized (s2){
    
                        s1.append("c");
                        s2.append("3");
    
                        try {
                            Thread.sleep(100);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
    
                        synchronized (s1){//互相僵持不下,等待对方释放资源 
                            s1.append("d");
                            s2.append("4");
    
                            System.out.println(s1);
                            System.out.println(s2);
                        }
    
    
                    }
    
    
    
                }
            }).start();
    
    
        }
    
    
    }
    
    
    //死锁的演示
    
    
    package com.atguigu.java1;
    //死锁的演示
    class A {
        public synchronized void foo(B b) { //同步监视器:A类的对象:a
            System.out.println("当前线程名: " + Thread.currentThread().getName()
                    + " 进入了A实例的foo方法"); ////        try {
    //            Thread.sleep(200);
    //        } catch (InterruptedException ex) {
    //            ex.printStackTrace();
    //        }
            System.out.println("当前线程名: " + Thread.currentThread().getName()
                    + " 企图调用B实例的last方法"); //
            b.last();
        }
    
        public synchronized void last() {//同步监视器:A类的对象:a
            System.out.println("进入了A类的last方法内部");
        }
    }
    
    class B {
        public synchronized void bar(A a) {//同步监视器:b
            System.out.println("当前线程名: " + Thread.currentThread().getName()
                    + " 进入了B实例的bar方法"); ////        try {
    //            Thread.sleep(200);
    //        } catch (InterruptedException ex) {
    //            ex.printStackTrace();
    //        }
            System.out.println("当前线程名: " + Thread.currentThread().getName()
                    + " 企图调用A实例的last方法"); //
            a.last();
        }
    
        public synchronized void last() {//同步监视器:b
            System.out.println("进入了B类的last方法内部");
        }
    }
    
    public class DeadLock implements Runnable {
        A a = new A();
        B b = new B();
    
        public void init() {
            Thread.currentThread().setName("主线程");
            // 调用a对象的foo方法
            a.foo(b);
            System.out.println("进入了主线程之后");
        }
    
        public void run() {
            Thread.currentThread().setName("副线程");
            // 调用b对象的bar方法
            b.bar(a);
            System.out.println("进入了副线程之后");
        }
    
        public static void main(String[] args) {
            DeadLock dl = new DeadLock();
            new Thread(dl).start();
    
    
            dl.init();
        }
    }
    
    
    
     
    不积跬步,无以至千里;不积小流,无以成江海。
  • 相关阅读:
    分布式进程
    T1008 选数 codevs
    P1364 医院设置 洛谷
    T1046 旅行家的预算 codevs
    T1164 统计数字 codevs
    codevs——T1860 最大数||洛谷——P1107 最大整数
    手动脱Mole Box V2.6.5壳实战
    手动脱FSG壳实战
    手动脱NsPacK壳实战
    手动脱UPX 壳实战
  • 原文地址:https://www.cnblogs.com/CCTVCHCH/p/14646666.html
Copyright © 2011-2022 走看看