Java多线程编程:死锁示例
在Java多线程编程中,死锁是一种常见的并发问题。当两个或更多的线程互相等待对方释放资源时,就形成了死锁。
以下是一个简单的Java死锁示例:
// 创建两个共享资源的类
public class Resource {
private boolean locked;
public Resource() {
this.locked = false;
}
// 为每个资源提供一个锁方法
public synchronized void lock() {
if (!locked) {
locked = true;
// 在这里添加需要锁定的资源代码,比如数据库连接等
} else {
System.out.println("Resource already locked.");
}
}
// 解除锁的方法
public synchronized void unlock() {
if (locked) {
locked = false;
// 在这里添加解锁并释放资源的代码
} else {
System.out.println("Resource not locked.");
}
}
}
// 创建两个线程,每个线程尝试获取另一个线程持有的资源
public class Main {
private Resource resource1, resource2;
public Main() {
resource1 = new Resource();
resource2 = new Resource();
// 创建并启动第一个线程
Thread thread1 = new Thread(() -> {
System.out.println("Thread 1 started.");
resource1.lock(); // 获取资源1
try {
Thread.sleep(500); // 暂停一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
// 在这里添加释放资源1并尝试获取资源2的代码
System.out.println("Thread 1 attempting to lock resource 2.");
resource2.lock(); // 尝试获取资源2
try {
Thread.sleep(500); // 暂停一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 1 unlocking resources.");
resource1.unlock();
resource2.unlock();
System.out.println("Thread 1 completed.");
}));
// 创建并启动第二个线程
Thread thread2 = new Thread(() -> {
System.out.println("Thread 2 started.");
resource2.lock(); // 获取资源2
try {
Thread.sleep(500); // 暂停一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 2 attempting to lock resource 1.");
resource1.lock(); // 尝试获取资源1
try {
Thread.sleep(500); // 暂停一段时间
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread 2 unlocking resources.");
resource2.unlock();
resource1.unlock();
System.out.println("Thread 2 completed.");
}));
thread1.start(); // 启动第一个线程
thread2.start(); // 同时启动第二个线程
}
}
在这个例子中,两个线程分别尝试获取对方持有的资源。由于每个资源都被锁定了,所以两个线程会陷入无限等待,从而形成死锁。
还没有评论,来说两句吧...