在Java中,线程死锁通常发生在两个或更多个线程相互等待对方释放资源的情况下。以下是一个简单的Java示例,展示了如何创建线程死锁:
public class DeadlockDemo {
// 定义两个资源
private static Object resource1 = new Object();
private static Object resource2 = new Object();
// 线程1
private static class Thread1 extends Thread {
public void run() {
synchronized (resource1) {
System.out.println("Thread 1: Got resource 1");
// 模拟一些耗时操作
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 尝试获取resource2,此时可能导致死锁
System.out.println("Thread 1: Waiting for resource 2");
synchronized (resource2) {
System.out.println("Thread 1: Got resource 2");
}
}
}
}
// 线程2
private static class Thread2 extends Thread {
public void run() {
synchronized (resource2) {
System.out.println("Thread 2: Got resource 2");
// 模拟一些耗时操作
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 尝试获取resource1,此时可能与线程1发生死锁
System.out.println("Thread 2: Waiting for resource 1");
synchronized (resource1) {
System.out.println("Thread 2: Got resource 1");
}
}
}
}
public static void main(String[] args) {
// 启动两个线程
new Thread1().start();
new Thread2().start();
}
}
在这个示例中,我们定义了两个资源resource1和resource2,以及两个线程Thread1和Thread2。线程1首先获取resource1的锁,然后尝试获取resource2的锁。与此同时,线程2首先获取resource2的锁,然后尝试获取resource1的锁。
由于线程1已经持有了resource1的锁,而线程2持有了resource2的锁,当线程1尝试获取resource2的锁时,它会被阻塞,因为线程2已经持有了这个锁。同样地,当线程2尝试获取resource1的锁时,它也会被阻塞,因为线程1已经持有了这个锁。这就导致了两个线程互相等待对方释放资源,从而发生了死锁。