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

  • 相关阅读:
    Linux免密登录
    HDFS shell 常用命令
    zabbix4.4图表中文显示乱码解决办法
    安装zabbix-agent
    安装配置zabbix4.4
    elasticsearch插件sql安装
    dedecms调用头部文件 dede:include时页面出现一行空白的解决方案
    DedeCMS <=5.7 SP2 file_class.php 任意文件上传漏洞
    DedeCMS后台文件任意上传漏洞media_add.php的修改方法
    织梦DEDECMS任意文件上传漏洞与注入漏洞修复方法
  • 原文地址:https://www.cnblogs.com/hkdpp/p/8341288.html
Copyright © 2011-2022 走看看