Java多线程并发问题:死锁和活锁示例
在Java多线程编程中,死锁和活锁是两种常见的并发问题。下面将分别给出这两种情况的示例。
- 死锁示例:
// 线程A拥有资源1,需要资源2
class ThreadA extends Thread {
private Resource resource1;
private Resource resource2;
public ThreadA(Resource resource1, Resource resource2) {
this.resource1 = resource1;
this.resource2 = resource2;
}
@Override
public void run() {
// 先获得资源1
if (resource1.acquire()) {
// 然后尝试获取资源2
try {
if (resource2.acquire()) {
System.out.println("线程A成功,没有发生死锁");
resource1.release();
resource2.release();
} else {
System.out.println("线程A获取资源2失败,发生了死锁");
resource1.release(); // 释放资源1,避免循环等待
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("线程A获取资源1失败,发生了死锁");
}
}
}
// 线程B拥有资源2,需要资源1
class ThreadB extends Thread {
private Resource resource1;
private Resource resource2;
public ThreadB(Resource resource1, Resource resource2) {
this.resource1 = resource1;
this.resource2 = resource2;
}
@Override
public void run() {
// 先获得资源2
if (resource2.acquire()) {
// 然后尝试获取资源1
try {
if (resource1.acquire()) {
System.out.println("线程B成功,没有发生死锁");
resource2.release();
resource1.release();
} else {
System.out.println("线程B获取资源1失败,发生了死锁");
resource2.release(); // 释放资源2,避免循环等待
}
} catch (InterruptedException e) {
e.printStackTrace();
}
} else {
System.out.println("线程B获取资源2失败,发生了死锁");
}
}
}
// 创建资源对象
Resource resource1 = new Resource(1);
Resource resource2 = new Resource(2);
// 启动两个线程
new ThreadA(resource1, resource2)).start();
new ThreadB(resource1, resource2)).start();
在这个示例中,线程A和线程B分别拥有资源1和资源2。如果线程A获取到资源1后尝试获取资源2,同时线程B在获取到资源2后尝试获取资源1,那么这两个线程就会陷入死锁状态。
还没有评论,来说两句吧...