Java多线程理解:死锁现象实例展示
死锁是多线程编程中的一个常见问题,它发生在两个或更多的线程互相等待对方释放资源的情况。
以下是一个简单的死锁现象实例展示:
// 假设我们有四个资源A、B、C和D
// 线程1(拥有资源A)需要资源B
// 线程2(拥有资源B)需要资源A
// 同时线程1等待线程2释放B,线程2等待线程1释放A
public class DeadLockExample {
private Object resourceA = new Object();
private Object resourceB = new Object();
public void thread1() {
try {
synchronized (resourceA) { // 获取A资源
if (acquireResource(resourceB))) { // 如果获取到B资源,继续操作
System.out.println("Thread 1: Acquired both A and B.");
performTask(); // 执行任务
releaseResource(resourceB); // 将B资源归还
}
else {
System.out.println("Thread 1: Could not acquire resource B.");
synchronized (resourceA) { // 再次获取A资源,循环等待
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
private boolean acquireResource(Object resource) throws InterruptedException {
System.out.println("Thread 1: Acquiring resource " + resource);
synchronized (resource) { // 获取锁,如果获取失败则返回false
if (!resource.lock()) {
return false;
}
System.out.println("Thread 1: Successfully acquired resource " + resource);
return true; // 获取成功,返回true
}
}
private void performTask() {
try {
Thread.sleep(2000); // 模拟耗时操作
System.out.println("Thread 1: Completed task.");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws InterruptedException {
DeadLockExample example = new DeadLockExample();
Thread thread1 = new Thread(example::thread1));
thread1.start(); // 启动线程1
thread1.join(); // 等待线程1结束
}
}
这个例子中,两个线程A和B互斥地获取资源,导致死锁。通过输出日志信息,可以看到线程的执行过程。
还没有评论,来说两句吧...