死锁产生的原因:
两个或两个以上的进程(线程)对某一个资源的请求,但是始终请求不到对应的资源,原因是其中有进程(线程)对其它进程(线程)需要的资源进行了锁,即: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
这位作者的文章中还有其它形式的,以及更详细的说明,我的参考代码部分出自其手,感谢。
有不懂的,还可以去看看。