zoukankan      html  css  js  c++  java
  • 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被共享的时候才会出现并发的情况,可通过构造函数的方式共享两个对象。

  • 相关阅读:
    优化C/C++代码的小技巧
    闭包,看这一篇就够了——带你看透闭包的本质,百发百中
    7215:简单的整数划分问题
    常见问题最佳实践三:服务启动顺序
    JAVA 用分苹果来理解本题
    arcgis访问格式
    墨卡托投影
    C# 从DataTable中取值
    Base64编码的字符串与图片的转换 C#
    墨卡托投影实现
  • 原文地址:https://www.cnblogs.com/hkdpp/p/8341288.html
Copyright © 2011-2022 走看看