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+"获得口红的锁"); } } } }
  • 相关阅读:
    华为手机内核代码的编译及刷入教程【通过魔改华为P9 Android Kernel 对抗反调试机制】
    AndroidStudio升级到4.0之后,出现Warning: Default Activity not found解决办法
    Python解决gensim加载doc2vec或work2vec向量训练模型文件太慢甚至无法访问的情况
    layui 上传插件控制上传文件个数(换个角度思考问题)
    CDN访问异常重定向
    sql 语句优化
    swipper全屏垂直滚动获取高度问题
    tp6.0相对于tp5.1的变化
    项目打包文件ipa包瘦身
    load和initialize的区别
  • 原文地址:https://www.cnblogs.com/rzkwz/p/12488154.html
Copyright © 2011-2022 走看看