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

  • 相关阅读:
    在vim中不能用鼠标右键粘贴和跨系统复制粘贴的解决办法
    2、cat
    OTG相关知识
    vim报错E325(出现.swp文件)地解决方法
    Linux命令1
    数组与集合
    if switch for while
    各类运算符
    java基础概念
    基于对话框的程序隐藏于托盘(二)
  • 原文地址:https://www.cnblogs.com/hkdpp/p/8341288.html
Copyright © 2011-2022 走看看