实现死锁的实例

自作多情 提交于 2019-12-11 13:44:24
package com.auth.test;

/**
 * 死锁实例
 * @author kang
 * @version 1.0
 * @date 2019/12/6 13:21
 */
public class DeadLock implements Runnable {
    public int flag = 1;
    //静态对象是类的所有对象共享的
    private static Object o1 = new  Object(), o2 = new Object();

    @Override
    public void run() {
        System.out.println("flag:{}" + flag);
        if(flag == 1){
            //先锁o1,在对o2加锁,环路等待条件
            synchronized (o1){
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }

                synchronized (o2){
                    System.out.println("1");
                }
            }
        }
        if(flag == 0){
            //先锁o2,在锁o1
            synchronized (o2){
                try {
                    Thread.sleep(500);
                } catch (Exception e) {
                    e.printStackTrace();
                }
                synchronized (o1){
                    System.out.println("0");
                }
            }
        }
    }

    public static void main(String[] args) {
        DeadLock td1 = new DeadLock();
        DeadLock td2 = new DeadLock();
        td1.flag = 1;
        td2.flag = 0;
        //td1,td2都处于可执行状态,但JVM线程调度先执行哪个线程是不确定的。
        //td2的run()可能在td1的run()之前运行
        new Thread(td1).start();
        new Thread(td2).start();
    }
}

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!