构造几个死锁的例子(Java )

目录

  • 构造几个死锁的例子(Java )

    • 1
    • 2
    • 3

构造几个死锁的例子(Java )

1

public class Deadlock {
    public static void main(String[] args) {
        final A a1 = new A("a1");
        final A a2 = new A("a2");
        a1.setA(a2);
        a2.setA(a1);
        Thread t1 = new Thread(()->{
            a1.method1();
        });
        Thread t2 = new Thread(()->{
            a2.method1();
        });
        t1.start();
        t2.start();
    }
}
class A {
    String name;
    A a;
    public A(String name) {
        this.name = name;
    }
    public void setA(A a) {
        this.a = a;
    }
    synchronized void method1() {
        System.out.println(Thread.currentThread().getName() + ": 锁住了" + name);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + ": 我在等待" + a.name);
        a.method2();
    }
    synchronized void method2() {
        System.out.println(Thread.currentThread().getName() + ": 我得到了" + name);
        System.out.println(Thread.currentThread().getName() + ": " + name + "." + a.name + ".method2()");
    }
}

运行结果:

2

public class Deadlock {
    public static void main(String[] args) {

        Thread t1 = new Thread(()->{
            A.method1();
        });
        Thread t2 = new Thread(()->{
            B.method1();
        });
        t1.start();
        t2.start();
    }
}
class A {
    synchronized static void method1() {
        System.out.println(Thread.currentThread().getName() + ": 锁住了" + A.class);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + ": 我在等待" + B.class);
        B.method2();
    }
    synchronized static void method2() {
        System.out.println(Thread.currentThread().getName() + ": 获得了" + A.class);
        System.out.println(Thread.currentThread().getName() + ": " + A.class + ".method2");
    }
}
class B {
    synchronized static void method1() {
        System.out.println(Thread.currentThread().getName() + ": 锁住了" + B.class);
        try {
            Thread.sleep(500);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName() + ": 我在等待" + A.class);
        A.method2();
    }
    synchronized static void method2() {
        System.out.println(Thread.currentThread().getName() + ": 获得了" + B.class);
        System.out.println(Thread.currentThread().getName() + ": " + B.class + ".method2");
    }
}

运行结果:

3

public class Deadlock {
    public static void main(String[] args) {
        final String lock1 = "lock1";
        final String lock2 = "lock2";
        Thread t1 = new Thread(()->{
            synchronized (lock1) {
                System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock1);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ": 在等待" + lock2);
                synchronized (lock2) {
                    System.out.println(Thread.currentThread().getName() + ": 获得了" + lock2);
                }
            }
        });
        Thread t2 = new Thread(()->{
            synchronized (lock2) {
                System.out.println(Thread.currentThread().getName() + ": 锁住了" + lock2);
                try {
                    Thread.sleep(500);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println(Thread.currentThread().getName() + ": 在等待" + lock1);
                synchronized (lock1) {
                    System.out.println(Thread.currentThread().getName() + ": 获得了" + lock1);
                }
            }
        });
        t1.start();
        t2.start();
    }
}

运行结果:

原文地址:https://www.cnblogs.com/Vaxy/p/11415775.html

时间: 2024-08-29 19:35:23

构造几个死锁的例子(Java )的相关文章

静态代码块、构造代码块、构造函数以及Java类初始化顺序

静态代码块:用staitc声明,jvm加载类时执行,仅执行一次构造代码块:类中直接用{}定义,每一次创建对象时执行.执行顺序优先级:静态块,main(),构造块,构造方法. 构造函数 public HelloA(){//构造函数 } 关于构造函数,以下几点要注意:1.对象一建立,就会调用与之相应的构造函数,也就是说,不建立对象,构造函数时不会运行的.2.构造函数的作用是用于给对象进行初始化.3.一个对象建立,构造函数只运行一次,而一般方法可以被该对象调用多次. 构造代码块 {//构造代码块 }

Java学习笔记——面试常客:写出一个死锁的例子

现在的面试挺蛋疼,为了考察大家的语言掌握水平,类似这样的题特别多,不过在某个角度来说确实能看出一个人对某个知识点的理解,就比如今天这个死锁的小例子,主要考察大家对线程死锁概念的理解程度,也考察大家对java语言的敲代码水平,下面是一个死锁的简单例子: <span style="font-size:18px;">class Test implements Runnable { private boolean flag; //flag标签,让t1和t2线程执行不同代码 publ

Java死锁的例子

死锁 死锁是这样一种情形:多个线程同时被阻塞,它们中的一个或者全部都在等待某个资源被释放.由于线程被无限期地阻塞,因此程序不可能正常终止. 导致死锁的根源在于不适当地运用“synchronized”关键词来管理线程对特定对象的访问.“synchronized”关键词的作用是,确保在某个时刻只有一个线程被允许执行特定的代码块,因此,被允许执行的线程首先必须拥有对变量或对象的排他性的访问权.当线程访问对象时,线程会给对象加锁,而这个锁导致其它也想访问同一对象的线程被阻塞,直至第一个线程释放它加在对象

java的一个简单死锁的例子

/* * 演示死锁:(由毕向东视频所得) * 一种解释:Thread—0拿到lock1锁,Thread—1拿到lock2锁,Thread—0想要lock2锁而Thread-1想要lock1锁, * 两个线程都无法继续执行下去,产生死锁. * 执行结果:Thread-0 if.....lock1 *  Thread-1 else....lock2 */package com.dld; public class DeadLockDemo { public static void main(Strin

Java的死锁的例子

代码: /*  * DESCRIPTION :   * USER : zhouhui  * DATE : 2017/8/2 10:12  */ public class DeadLockDemo {     public static void main(String[] args) {         //分别定义两个被锁的对象         Entity entity1 = new Entity("entity1");         Entity entity2 = new E

java多线程_死锁的例子

/*说明:零长度的byte数组对象创建起来将比任何对象都经济,查看编译后的字节码: 生成零长度的byte[]对象只需3条操作码,而Object lock = new Object()则需要7行操作码.*/ public class DeadLock { public static void main(String[] args) { byte[] lock1 = new byte[0]; byte[] lock2 = new byte[0]; Thread th1=new Thread(new

Java死锁排查和Java CPU 100% 排查的步骤整理

工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力. 一.Java死锁排查 通过标题我们就要思考三个问题: 什么是死锁? 为什么会出现死锁? 怎么排查代码中出现了死锁? 作为技术人员(工程师),在面对问题的时候,可能需要的能力是

Java死锁排查和Java CPU 100% 排查的步骤整理(转)

工欲善其事,必先利其器 简介 本篇整理两个排查问题的简单技巧,一个是java死锁排查,这个一般在面试的时会问到,如果没有写多线程的话,实际中遇到的机会不多:第二个是java cpu 100%排查,这个实际的开发中,线的应用出现这个问题可能性比较大,所以这里简单总结介绍一下,对自己学习知识的一个整理,提高自己的解决问题能力. 一.Java死锁排查 通过标题我们就要思考三个问题: 什么是死锁? 为什么会出现死锁? 怎么排查代码中出现了死锁? 作为技术人员(工程师),在面对问题的时候,可能需要的能力是

关于死锁,并用Java实现一个死锁

产生死锁的原因主要是: (1) 因为系统资源不足. (2) 进程运行推进的顺序不合适. (3) 资源分配不当等. 如果系统资源充足,进程的资源请求都能够得到满足,死锁出现的可能性就很低,否则 就会因争夺有限的资源而陷入死锁.其次,进程运行推进顺序与速度不同,也可能产生死锁. 产生死锁的四个必要条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺.