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

    //死锁:多个线程相互抱着对方需要的资源,然后形成僵局
    public class DeadLock {
        public static void main(String[] args) {
            Makeup makeup1 = new Makeup(0,"小老虎");
            Makeup makeup2 = new Makeup(1,"小湖裏");
    
            makeup1.start();
            makeup2.start();
        }
    }
    
    //口红
    class Lisptick{
    
    }
    
    //镜子
    class Mirror{
    
    }
    
    class Makeup extends  Thread{
        //需要的资源只有一份,用static来保证只有一份
        static Lisptick lisptick = new Lisptick();
        static Mirror mirror = new Mirror();
    
        int choise;//选择
        String girlName;//使用化妆品的人
    
        public Makeup(int choise,String girlName){
            this.choise=choise;
            this.girlName=girlName;
        }
    
        public void run(){
            //化妆
            try {
                makeup();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        //互相持有对方的锁,就是需要拿到对方的资源
        private void makeup() throws InterruptedException {
            if(choise==0){
                //获得口红的锁
                synchronized(lisptick){
                    System.out.println(this.girlName+"获得口红的锁");
                    Thread.sleep(1000);
    
                    synchronized(mirror){//一秒钟后获得镜子的锁
                        System.out.println(this.girlName+"获得镜子的锁");
                    }
                }
            }else{
                //获得口红的锁
                synchronized(mirror){
                    System.out.println(this.girlName+"获得镜子的锁");
                    Thread.sleep(2000);
    
                    synchronized(lisptick){//一秒钟后获得镜子的锁
                        System.out.println(this.girlName+"获得口红的锁");
                    }
                }
            }
        }
    }
    
    
    
    
    
    --------------------------解决死锁---------------
    把内部的synchronized提到外边的synchronize外面去
    //死锁:多个线程相互抱着对方需要的资源,然后形成僵局 public class DeadLock { public static void main(String[] args) { Makeup makeup1 = new Makeup(0,"小老虎"); Makeup makeup2 = new Makeup(1,"小湖裏"); makeup1.start(); makeup2.start(); } } //口红 class Lisptick{ } //镜子 class Mirror{ } class Makeup extends Thread{ //需要的资源只有一份,用static来保证只有一份 static Lisptick lisptick = new Lisptick(); static Mirror mirror = new Mirror(); int choise;//选择 String girlName;//使用化妆品的人 public Makeup(int choise,String girlName){ this.choise=choise; this.girlName=girlName; } public void run(){ //化妆 try { makeup(); } catch (InterruptedException e) { e.printStackTrace(); } } //互相持有对方的锁,就是需要拿到对方的资源 private void makeup() throws InterruptedException { if(choise==0){ //获得口红的锁 synchronized(lisptick){ System.out.println(this.girlName+"获得口红的锁"); Thread.sleep(1000); } synchronized(mirror){//一秒钟后获得镜子的锁 System.out.println(this.girlName+"获得镜子的锁"); } }else{ //获得口红的锁 synchronized(mirror){ System.out.println(this.girlName+"获得镜子的锁"); Thread.sleep(2000); } synchronized(lisptick){//一秒钟后获得镜子的锁 System.out.println(this.girlName+"获得口红的锁"); } } } }
  • 相关阅读:
    string用法
    动手动脑
    你已经创建了多少个对象?
    动手动脑
    课程作业2
    课程作业1
    课程作业2
    《大道至简》第一章观后感
    java虚拟机内存区域
    Gitbook安装使用教程
  • 原文地址:https://www.cnblogs.com/rzkwz/p/12488154.html
Copyright © 2011-2022 走看看