java死锁的产生与解决

死锁产生的原因:
两个或两个以上的进程(线程)对某一个资源的请求,但是始终请求不到对应的资源,原因是其中有进程(线程)对其它进程(线程)需要的资源进行了锁,即:synchronized

产生的形式一般为:
锁中套锁:
例如
1:被锁代码块1里面 还有 被锁代码块2 且 2需要 1锁定的资源
2:被锁代码块1里面 还有 被锁方法2 且 2需要 1锁定的资源
等好几种

给一份参考:
记得要给第一个获得资源的锁,加长锁时间哦,不然,其他线程还没开始锁,第一个就用完释放了,看不到效果哦
方法锁方法的:

package com.j.daethlock;

/**
 * @Description 形成死锁
 * @Date 2020-04-19 -- 22:07
 * @Author joker
 * @Version 1.0
 */
class TestLock  extends  Thread{
    private TestClass class1;
    private TestClass class2;

    public TestLock(TestClass class1, TestClass class2) {
        this.class1 = class1;
        this.class2 = class2;
    }

    @Override
    public void run() {
        class1.method(class2);
    }

}
public class Client {
    public static void main(String[] ars) {
        TestClass classA = new TestClass();
        TestClass classB = new TestClass();
        new TestLock(classA, classB).start();
        new TestLock(classB, classA).start();
    }
}
 class TestClass {

    public synchronized void method(TestClass clazz) {

        System.out.println("TestClass method in");
        clazz.method2();
        System.out.println("TestClass method out");
        //增加反应时间,一定能锁住
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public synchronized void method2() {
        System.out.println("TestClass method2");
    }
}

不加反应时间,产生死锁就随缘了
:可出现以下情况“:
在这里插入图片描述
在这里插入图片描述
解决方法比较简单:
1.可以将锁的范围缩小
2.改变锁的顺序(自己给锁定义一个顺序,每次判断这个锁的标识,确定顺序,解除死锁)

代码参考:
https://blog.csdn.net/lyabc123456/article/details/81060477

这位作者的文章中还有其它形式的,以及更详细的说明,我的参考代码部分出自其手,感谢。
有不懂的,还可以去看看。

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值