线程
线程死锁
线程同步锁类
public class Lock {
// 创建线程同步锁1
static Object lock1 = new Object();
// 创建线程同步锁2
static Object lock2 = new Object();
}
线程类
public class ThreadDieLock implements Runnable{
// 定义一个flag成员变量用来控制下面的代码
private boolean flag;
// 将flag的构造器显示地定义出来
public ThreadDieLock(boolean flag) {
super();
this.flag = flag;
}
@Override
public void run() {
if(flag) {
synchronized (Lock.lock1) {
System.out.println("线程一使用了线程同步锁1!");
synchronized (Lock.lock2) {
System.out.println("线程一使用了线程同步锁2!");
}
}
}else {
synchronized (Lock.lock2) {
System.out.println("线程二使用了线程同步锁2!");
synchronized (Lock.lock1) {
System.out.println("线程二使用了线程同步锁1!");
}
}
}
}
}
测试类
public class ThreadDieLockTest {
public static void main(String[] args) {
// 这里的参数列表的值决定if语句的结果
// 先执行if语句块内的语句
ThreadDieLock th = new ThreadDieLock(true);
// 再执行else语句块内的语句
ThreadDieLock th2 = new ThreadDieLock(false);
Thread t = new Thread(th);
Thread t2 = new Thread(th2);
t.start();
t2.start();
}
}
输出结果:
线程一使用了线程同步锁1!
线程二使用了线程同步锁2!
上述代码就是一个明显的线程死锁的例子,并且执行完后JVM还处于运行状态。
执行逻辑:
①在if语句块内让线程一去获得线程同步锁1,然后在线程同步锁1的代码块中再让线程一获得线程同步锁2;
②在else语句块内让线程二获得线程同步锁2,然后在线程同步锁2的代码块中再让线程二获得线程同步锁2;
在测试类代码中,我们的理想结果是先让线程一获得到线程同步锁1,然后线程二获得线程同步锁2,再然后让线程一获得到线程同步锁2,最后让线程二获得到线程同步锁2。
但实际是由于一开始线程一获得到了线程同步锁1,线程二获得到线程同步锁2,并且在两个线程都没有释放线程同步锁的前提下去获取互相的同步锁,于是就造成了线程死锁的情况,在做线程开发时,要避免线程死锁的情况。
本文通过一个具体的Java代码示例,详细解析了线程死锁的现象及发生原因。展示了如何通过两个线程分别获取不同的锁,进而导致彼此无法继续执行而陷入死锁的状态。
1953

被折叠的 条评论
为什么被折叠?



