public class DeadlockExample {
private static final Object lock1 = new Object();
private static final Object lock2 = new Object();
public static void main(String[] args) {
Thread thread1 = new Thread(new Task1());
Thread thread2 = new Thread(new Task2());
thread1.start();
thread2.start();
}
static class Task1 implements Runnable {
@Override
public void run() {
synchronized (lock1) {
System.out.println("Thread 1: Holding lock 1...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1: Waiting for lock 2...");
synchronized (lock2) {
System.out.println("Thread 1: Holding lock 1 & 2...");
}
}
}
}
static class Task2 implements Runnable {
@Override
public void run() {
synchronized (lock2) {
System.out.println("Thread 2: Holding lock 2...");
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 2: Waiting for lock 1...");
synchronized (lock1) {
System.out.println("Thread 2: Holding lock 1 & 2...");
}
}
}
}
}
在这个示例中,我们创建了两个线程 thread1
和 thread2
,每个线程分别尝试获取两个锁 lock1
和 lock2
。线程 thread1
先获取 lock1
,然后等待 lock2
;而线程 thread2
先获取 lock2
,然后等待 lock1
。
由于这两个线程互相等待对方释放锁,导致了一个死锁的情况。具体来说:
thread1
持有 lock1
并等待 lock2
。thread2
持有 lock2
并等待 lock1
。因为两个线程都在等待对方释放锁,所以它们会永远阻塞,形成死锁。
为了避免死锁,可以采取一些措施,例如使用超时机制、按顺序获取锁或者使用更高级的并发工具(如 ReentrantLock
)。
下一篇:java volatile关键字
Laravel PHP 深圳智简公司。版权所有©2023-2043 LaravelPHP 粤ICP备2021048745号-3
Laravel 中文站