线程中发生死锁的原理:
执行多线程任务中,出现了多个同步,即存在多个锁对象,且在一个同步中嵌套了其他的同步,可以这样简单理解,有一个线程任务,在获得锁a之后执行一些操作,接着需要获得锁b才能执行接下来的操作,另一个类,正好与该类相反,先获取锁a,执行,再获取锁b执行,存在某一时刻,二者都进入了获取第二个锁资源的时刻,但是run()方法未执行完毕,也不会释放锁资源,两个线程将会处于无限等待状态,造成对内存资源的极大消耗。因此,在设计程序时,尽量避免该情况的发生。
代码实现:
class DeadLock1 extends Thread{
private String locka;
private String lockb;
public DeadLock1(String locka,String lockb) {
this.locka = locka;
this.lockb = lockb;
}
@Override
public void run() {
synchronized(locka) {
System.out.println(Thread.currentThread().getName()+"获取locka之后的执行操作");
try {
Thread.sleep(1000);
} catch (InterruptedException e1) {
e1.printStackTrace();
}
synchronized(lockb) {
System.out.println(Thread.currentThread().getName()+"获取lockb之后执行操作");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
}
class DeadLock2 extends Thread{
private String locka;
private String lockb;
public DeadLock2(String locka,String lockb) {
this.locka = locka ;
this.lockb = lockb;
}
@Override
public void run() {
synchronized(lockb) {
System.out.println(Thread.currentThread().getName()+"获取lockb之后的执行操作");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
synchronized(locka) {
System.out.println(Thread.currentThread().getName()+"获取lockb之后的执行操作");
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
public class Deadlock {
public static void main(String[] args) {
String locka ="locka";
String lockb = "lockb";
DeadLock1 thread1 = new DeadLock1(locka, lockb);
DeadLock2 thread2 = new DeadLock2(locka, lockb);
thread1.start();
thread2.start();
}
}
执行完毕的结果,线程1,2都不会接着执行,而处于无限等待的状态。