java中关于死锁的概念和实例操作

关于synchronize死锁的例子和避免死锁的例子

产生死锁的原因主要是:
  (1) 因为系统资源不足。
  (2) 进程运行推进的顺序不合适。
  (3) 资源分配不当等。

产生死锁的四个必要条件:
  (1) 互斥条件:一个资源每次只能被一个进程使用。
  (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
  (3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
  (4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。

死锁的解除与预防:
  理解了死锁的原因,尤其是产生死锁的四个必要条件,就可以最大可能地避免、预防和
  解除死锁。所以,在系统设计、进程调度等方面注意如何不让这四个必要条件成立,如何确
  定资源的合理分配算法,避免进程永久占据系统资源。此外,也要防止进程在处于等待状态
  的情况下占用资源。因此,对资源的分配要给予合理的规划。

那么接下来我们进入代码区域一起来看看关于死锁和解锁死锁的那些例子吧:

/*
 * @author Mr liu
 * 介绍死锁的概念然后怎样避免死锁的发生
 */
public class synchronizLock {
    public static void main(String[] args) {
        Thread T1=new Thread(new Runnable() {
            public void run() {
                synchronizLock.method1();
            }
        });
        Thread T2=new Thread(new Runnable() {
            public void run() {
                synchronizLock.method2();
            }
        });
        T1.start();
        T2.start();
        
    }
    public static void method1(){

//线程a
        synchronized (String.class) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("正在努力获取String类型的class");
            synchronized (Integer.class) {
                System.out.println("获取Integer类型的class");
            }
        }
    }
    public static void method2(){

//线程b
        synchronized (Integer.class) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("正在努力获取Integer类型的class");
            synchronized (String.class) {
                System.out.println("获取String类型的class");
            }
        }
    }

}

输出结果:

这个时候就造成了死锁的发生:堵塞(原因) 无限继续向下堵塞   线程b获取不到所需的线程a  线程a也获取不到所需的线程b

 

那么我们来看一下避免死锁的例子:

/*
 * @author Mr liu
 * 介绍死锁的概念然后怎样避免死锁的发生
 */
public class synchronizLock {
    public static void main(String[] args) {
        Thread T1=new Thread(new Runnable() {
            public void run() {
                synchronizLock.method1();
            }
        });
        Thread T2=new Thread(new Runnable() {
            public void run() {
                synchronizLock.method2();
            }
        });
        T1.start();
        T2.start();
        
    }
    public static void method1(){

//线程a
        synchronized (Integer.class) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("正在努力获取Integer类型的class");
            synchronized (String.class) {
                System.out.println("获取String类型的class");
            }
        }
    }
    public static void method2(){

//线程b
        synchronized (Integer.class) {
            try {
                Thread.sleep(2000);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.println("正在努力获取Integer类型的class");
            synchronized (String.class) {
                System.out.println("获取String类型的class");
            }
        }
    }

}

输出结果:

我们看到此时的线程a 持有 线程b需要的锁,而线程b持有线程a需要的锁的逻辑了 (同步锁一致)可以理解为锁之间的各有所需一一对应了

 

总结:上面就是我在基础自学中总结出来的结果,关于更多的锁知识的内容下次更新,各位大佬如有其它更好的方法欢迎大家评论留言。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值