关于java死锁

一、什么是死锁?

    线程死锁是只两个或多个线程互相持有对方所需要的资源,导致这些线程处于等待状态,互相等待对方释放资源,如果线程都不主动释放锁占有资源,将会导致死锁。

二、产生死锁的原因?

1、系统资源不足;2、资源分配不当;3、进程推进顺序不合适

三、产生死锁的条件?

1、互斥条件:进程对于所分配到的资源具有排它性,一个资源只能被一个进程占用,直到该资源被进程释放;

2、请求和保持条件:一个进程因为请求被占用资源而发生阻塞时,对已获得的资源保持不放;

3、不可剥夺条件:任何一个资源在没被该进程释放前,其它任何进程都无法进行剥夺占用;

4、循环等待条件:当发生死锁时,所等待的进程必定会发生一个环路(类似死循环),造成永久阻塞。

四、解决死锁

 解决死锁一般就是通过破坏产生死锁的条件来实现,

 1、破坏互斥条件:一般这个无法实现;

2、破坏请求和保持条件:一次性获取所有资源;

3、破坏不可剥夺条件:加入定时机制;

4、破坏循环等待条件:按顺序获取资源。

五、java实现死锁demo

public class LockDemo {

    public static String block1 = "block1";

    public static String block2 = "block2";

    public static void main(String []args){

        Thread t1 = new Thread(new lock1());

        Thread t2 = new Thread(new lock2());

        t1.start();

        t2.start();

    }

}

class lock1 implements Runnable{

    @Override

    public void run() {

        System.out.println("lock1 is running");

        while(true){

            synchronized (LockDemo.block1){

            System.out.println("lock block1");

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            } synchronized (LockDemo.block2){

                System.out.println("lock block2");

            }

    }

}

class lock2 implements Runnable {

    @Override

    public void run() {

        System.out.println("lock2 is running");

        synchronized (LockDemo.block2){

            System.out.println("lock block2");

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            } synchronized (LockDemo.block1){

                System.out.println("lock block1");

            }

        }

    }

}

六、解决死锁demo

这里通过破坏循环等待条件,按顺序加锁(可以看到两个线程的加锁顺序是一样的)

public class LockDemo {

    public static String block1 = "block1";

    public static String block2 = "block2";

    public static void main(String []args){

        Thread t1 = new Thread(new lock1());

        Thread t2 = new Thread(new lock2());

        t1.start();

        t2.start();

    }

}

class lock1 implements Runnable{

    @Override

    public void run() {

        System.out.println("lock1 is running");

        while(true){

            synchronized (LockDemo.block2){

            System.out.println("lock block1");

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            } synchronized (LockDemo.block1){

                System.out.println("lock block2");

            }

    }

}

class lock2 implements Runnable {

    @Override

    public void run() {

        System.out.println("lock2 is running");

        synchronized (LockDemo.block2){

            System.out.println("lock block2");

            try {

                Thread.sleep(100);

            } catch (InterruptedException e) {

                e.printStackTrace();

            } synchronized (LockDemo.block1){

                System.out.println("lock block1");

            }

        }

    }

}

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 摘要: 我们已经知道,synchronized 是Java的关键字,是Java的内置特性,在JVM层面实现了对临界...
    kingZXY2009阅读 5,770评论 0 20
  • 小编费力收集:给你想要的面试集合 1.C++或Java中的异常处理机制的简单原理和应用。 当JAVA程序违反了JA...
    八爷君阅读 10,148评论 1 114
  • 本文主要讲了java中多线程的使用方法、线程同步、线程数据传递、线程状态及相应的一些线程函数用法、概述等。 首先讲...
    李欣阳阅读 7,186评论 1 15
  • 现在的苏东坡,在杭州人太守,此时的他,也有着皇太后的支持,他在杭州,远比在京都好,可以为老百姓,做出更多的贡献,他...
    贇贇的政阅读 2,571评论 0 0
  • 注册品牌 理想智造的英文品牌名称为“LEADING IDEAL”,品牌 LOGO “LI”灵感来自英文名称 LEA...
    外腾湖南阅读 921评论 0 0