5分钟30行java代码了解死锁

个人理解:
死锁本质就是线程在等待获得它永远无法等到的锁,然后傻傻的一直等,使得该线程无法执行后面的任务.
形成条件:
如何才能获得构造出这种情况呢,最简单的模型就是两个线程和两个锁,每个线程运行一段时间后获得自己的锁,再运行一段时间后,在释放自己的锁前,又想要获得对方的锁.然后两线程就陷入了无尽的等待.
为什么会变成这样子呢?本来高高兴兴,本来双倍快乐,是道德的沦丧还是人性的扭曲?!!话不多说看一下代码吧

public class DeadLock {
    static Object lock1 = new Object();
    static Object lock2 = new Object();
    public static void main(String[] args) throws Exception {
        new Thread(()->{
            try {
                System.out.println("线程1开始执行");
                fun1();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
        new Thread(()->{
            try {
                System.out.println("线程2开始执行");
                fun2();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }).start();
    }
    static void fun1() throws InterruptedException {
        synchronized (lock1){
            System.out.println("执行方法1");
            Thread.sleep(2000);
            fun2();
        }
    }
    private static void fun2() throws InterruptedException {
        synchronized (lock2){
            System.out.println("执行方法2");
            fun1();
        }
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 2,515评论 1 15
  • Java多线程学习 [-] 一扩展javalangThread类 二实现javalangRunnable接口 三T...
    影驰阅读 3,002评论 1 18
  • 本文出自 Eddy Wiki ,转载请注明出处:http://eddy.wiki/interview-java.h...
    eddy_wiki阅读 2,252评论 0 14
  • 1.解决信号量丢失和假唤醒 public class MyWaitNotify3{ MonitorObject m...
    Q罗阅读 924评论 0 1
  • 林炳文Evankaka原创作品。转载自http://blog.csdn.net/evankaka 本文主要讲了ja...
    ccq_inori阅读 676评论 0 4