Java多线程并发问题:死锁案例
死锁是多线程编程中的一种严重问题,它会导致所有线程都无法继续执行。
以下是一个经典的Java死锁案例:
// 线程1,拥有资源A和B
class ResourceA {
int count = 1;
synchronized void use() {
count--;
System.out.println("Resource A used by Thread-1");
if (count == 0) {
System.out.println("Resource A released by Thread-1");
}
}
}
class ResourceB {
int count = 1;
synchronized void use() {
count--;
System.out.println("Resource B used by Thread-1");
if (count == 0) {
System.out.println("Resource B released by Thread-1");
}
}
}
// 线程2,拥有资源C和D
class ResourceC {
int count = 1;
synchronized void use() {
count--;
System.out.println("Resource C used by Thread-2");
if (count == 0) {
System.out.println("Resource C released by Thread-2");
}
}
}
class ResourceD {
int count = 1;
synchronized void use() {
count--;
System.out.println("Resource D used by Thread-2");
if (count == 0) {
System.out.println("Resource D released by Thread-2");
}
}
}
public class DeadlockExample {
private ResourceA ra1 = new ResourceA();
private ResourceB rb1 = new ResourceB();
private ResourceC rc1 = new ResourceC();
private ResourceD rd1 = new ResourceD();
public void startThreads() {
// 线程1,获取资源A和B
Thread thread1 = new Thread(() -> ra1.use() && rb1.use()));
thread1.start();
// 线程2,获取资源C和D
Thread thread2 = new Thread(() -> rc1.use() && rd1.use()));
thread2.start();
}
public static void main(String[] args) {
DeadlockExample example = new DeadlockExample();
example.startThreads();
}
}
这个例子中,线程1拥有资源A和B(ra1.use()
和 rb1.use()
),线程2拥有资源C和D(rc1.use()
和 rd1.use()
)。
当线程1先使用完A后,会释放资源A,然后尝试去获取资源B。此时,如果线程2已经使用完C后释放了资源C,但是资源D还没被线程2使用完毕,那么线程1就无法获取到资源B,从而形成死锁。
还没有评论,来说两句吧...