深入理解:Java多线程并发问题示例
在Java中,多线程并发问题是编程中的常见挑战。主要涉及以下几种问题:
- 死锁:多个线程相互等待对方释放资源,导致所有线程都无法继续执行。
示例:
class Resource {
boolean locked;
Resource() { locked = false; }
}
class ThreadA implements Runnable {
Resource res;
ThreadA(Resource res) { this.res = res; }
@Override
public void run() {
res.locked = true;
try {
System.out.println("Thread A: waiting...");
// 线程B等待ThreadA释放资源
Thread.sleep(500);
} finally {
res.locked = false;
System.out.println("Thread A: released resources");
}
}
}
class ThreadB implements Runnable {
Resource res;
ThreadB(Resource res) { this.res = res; }
@Override
public void run() {
res.locked = true;
try {
System.out.println("Thread B: waiting for A...");
// 线程A释放资源后,线程B尝试获取资源
Thread.sleep(2000);
} finally {
res.locked = false;
System.out.println("Thread B: released resources");
}
}
}
public class Main {
public static void main(String[] args) {
Resource res = new Resource();
ThreadA threadA = new ThreadA(res);
ThreadB threadB = new ThreadB(res);
// 启动线程
new Thread(threadA).start();
new Thread(threadB).start();
System.out.println("Main: exiting...");
}
}
在这个例子中,ThreadA
和ThreadB
是两个并发的线程。它们互为等待者和释放者,导致了死锁现象。
要避免死锁,通常需要遵循以下原则:
- 一个资源被请求后,必须能够保持状态,以便在满足请求条件时再次使用。
- 不要让一个线程永远等待另一个线程释放资源。
- 建立适当的锁机制,确保在访问共享资源时不会互相干扰。
还没有评论,来说两句吧...