zoukankan      html  css  js  c++  java
  • java基础知识回顾之java Thread类学习(七)--java多线程安全问题(死锁)

    死锁:是两个或者两个以上的线程被无限的阻塞,线程之间互相等待所需资源。

    线程死锁产生的条件:

    • 当两个线程相互调用Join()方法。
    • 当两个线程使用嵌套的同步代码块的时候,一个线程占用了另一个线程的锁,互相等待阻塞,就有可能产生死锁

    下面看代码:

    代码1:死锁的案例

    package com.lp.ecjtu.Thread;
    
    
    /*
    死锁:常见情景之一:同步的嵌套。
    
    */
    class Ticket implements Runnable
    {
        private  int num = 100;
        Object obj = new Object();
        boolean flag = true;
        public void run()
        {
            if(flag)
                while(true)
                {
                    synchronized(obj)//同步代码块里面调用同步函数
                    {
                        show();
                    }
                }
            else
                while(true)
                    this.show();
        }
    
        public synchronized void show()//同步函数里面的调用同步代码块
        {
    
            synchronized(obj)
            {
                if(num>0)
                {
                    try{Thread.sleep(10);}catch (InterruptedException e){}
                    
                    System.out.println(Thread.currentThread().getName()+".....sale...."+num--);
                }
            }
        }
    }
    
    
    public class DeathLockThread1 
    {
        public static void main(String[] args) 
        {
            Ticket t = new Ticket();
            Thread t1 = new Thread(t);
            Thread t2 = new Thread(t);
            t1.start();
            try{Thread.sleep(10);}catch(InterruptedException e){}
            t.flag = false;
            t2.start();
        }
    }

    代码2:

    package com.lp.ecjtu.Thread;
    
     class DeathLockRunable implements Runnable{
        private boolean flag;
        public DeathLockRunable(boolean flag){
            this.flag = flag;
        }
    
        @Override
        public void run() {
            if(flag){
                synchronized (Lock.mylock1){
                    System.out.println("if mylock1"+Thread.currentThread().getName());
                    synchronized (Lock.mylock2){
                        System.out.println("if mylock2"+Thread.currentThread().getName());
                    }
                }
            }else{
                synchronized (Lock.mylock2){
                    System.out.println("else mylock2"+Thread.currentThread().getName());
                    synchronized (Lock.mylock1){
                        System.out.println("else mylock1"+Thread.currentThread().getName());
                    }
                }
            }
        }
    
    }
     
     class Lock{
        static Object mylock1 = new Object();
        static Object mylock2 = new Object();
     }
     
     public class DeathLockThread{
         public static void main(String[] args){
             Thread t1 = new Thread(new DeathLockRunable(true));
             Thread t2 = new Thread(new DeathLockRunable(false));
             t1.start();
             t2.start();
         }
     }

    输出结果:if mylock1Thread-0
    else mylock2Thread-1


     
  • 相关阅读:
    PHP操作数据库
    ANE打包
    我的C++笔记(数据的共享与保护)
    js 正计时和倒计时
    JAVA 日期 一个时间段总共几周,每一天星期几
    mybatis 处理in
    freemarker
    正则手机验证,身份证验证
    签到
    spring定时器
  • 原文地址:https://www.cnblogs.com/200911/p/3900737.html
Copyright © 2011-2022 走看看