Java多线程困惑:死锁示例
在Java编程中,理解多线程的死锁问题是非常重要的。以下是一个经典的死锁示例:
示例代码(使用Java语法):
// 定义两个线程资源
class Resource1 {
int count = 5;
synchronized void use() {
if (count > 0) {
count--;
System.out.println("Resource1 used by Thread " + Thread.currentThread().getName());
} else {
System.out.println("Resource1 is out of stock.");
}
}
}
class Resource2 {
int count = 5;
synchronized void use() {
if (count > 0) {
count--;
System.out.println("Resource2 used by Thread " + Thread.currentThread().getName());
} else {
System.out.println("Resource2 is out of stock.");
}
}
}
// 线程1想要使用资源1
class ThreadA extends Thread {
Resource1 resource1;
public ThreadA(Resource1 resource1) {
this.resource1 = resource1;
}
@Override
public void run() {
try {
// 资源1被线程A占用,其他线程等待资源释放
resource1.use();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 线程2想要使用资源2,但资源1已被线程A占用
class ThreadB extends Thread {
Resource2 resource2;
public ThreadB(Resource2 resource2) {
this.resource2 = resource2;
}
@Override
public void run() {
try {
// 资源2被线程B占用,但资源1仍被线程A占用
resource2.use();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
// 两个线程同时尝试获取并使用各自需要的资源
public class DeadLockExample {
public static void main(String[] args) {
Resource1 resource1 = new Resource1();
ThreadA threadA = new ThreadA(resource1);
ThreadB threadB = new ThreadB(resource2);
// 启动两个线程
threadA.start();
threadB.start();
}
}
在这个示例中,当线程A试图使用资源1时(但资源1被线程B占用),它会被阻塞。同理,线程B在尝试使用资源2时也会被阻塞。
由于两个线程都在等待对方释放资源,这就形成了一个死锁循环。因此,如果需要避免这种情况,就需要对多线程的并发控制进行设计和处理。
还没有评论,来说两句吧...