• java实现死锁的demo


    死锁

    只有当t1线程占用o1且正好也需要o2,t2此时占用o2且正好也需要o1的时候才会出现死锁,(类似于2个人拿着两个筷子吃饭,都是需要对方的一根筷子才能吃)

    以下代码t1线程占用o1,并且获取到o2对象后才会释放o1,而t2线程先占用o2又去获取o1,而此时的o1被t1线程占用,o2被t2线程占用,t1和t2都在无限等待,就会出现死锁。

    package javasimple;
    /**
     * 死锁demo
     * @author haokui
     *
     */
    public class DieSynchronized {
        public static void main(String[] args) {
            /**
             * 创建并启动两个线程t1、t2。两个线程都要共享o1、o2两个对象
             */
            Object o1 =  new Object();
            Object o2 =  new Object();
            Thread t1 = new Thread(new T1(o1,o2));
            Thread t2 = new Thread(new T2(o1,o2));
            t1.start();
            t2.start();
        }
    }
    //创建两个线程类
    class T1 implements Runnable {
        Object o1;
        Object o2;
        public T1(Object o1, Object o2){
            this.o1 = o1;
            this.o2 = o2;
        }
        public void run() {
            //锁o1和o2
            synchronized (o1) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (o2) {
                    System.out.println("o2");
                }
            }
        }
    }
    class T2 implements Runnable {
        Object o1;
        Object o2;
        public T2(Object o1, Object o2){
            this.o1 = o1;
            this.o2 = o2;
        }
        public void run() {
            synchronized (o2) {
                try {
                    Thread.sleep(1000);
                } catch (InterruptedException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
                synchronized (o1) {
                    System.out.println("o1");
                }
            }
            
        }
    }

    注意:只有o1和o2被共享的时候才会出现并发的情况,可通过构造函数的方式共享两个对象。

  • 相关阅读:
    截取最后一个下划线前面的字符串
    jqgrid加载本地数据功能
    Android、Ios手机端字体根据屏幕分辨率自适应的方法,使用rem和px的区别
    js获取8个月前时间,1天前时间
    手机端/pc端 弹出后,禁止底部页面滚动方法
    列表左右滚动
    jQuery点击隐藏点击显示,计算高度,位置,给当前加上焦点,其他去掉焦点
    工厂模式浅析
    教你看懂UML类图
    Rpc基础篇
  • 原文地址:https://www.cnblogs.com/hkdpp/p/8341288.html
Copyright © 2020-2023  润新知