实例理解Java多线程并发问题
在Java中,多线程并发问题是编程中的常见挑战。下面是一个简单理解和实例解析Java多线程并发问题的例子:
- 线程同步:这是最常见的并发问题。例如,在一个银行账户类中,如果两个线程同时修改存款金额,可能会导致数据不一致。
// 线程同步示例(使用synchronized关键字)
class BankAccount {
private double balance;
public synchronized void deposit(double amount) {
balance += amount;
notifyAll(); // 唤醒等待的线程
}
public synchronized void withdraw(double amount) {
if (amount > balance) {
throw new IllegalArgumentException("Insufficient balance");
}
balance -= amount;
notifyAll(); // 唤醒等待的线程
}
// 省略其他方法和构造器
}
- 死锁:当两个或更多的线程在执行过程中,因争夺资源而造成的一种互相等待的现象称为死锁。
// 死锁示例(使用两个互斥的资源)
class DeadlockExample {
private Object resource1 = new Object();
private Object resource2 = new Object();
// 两个互斥的线程方法
public void threadA() {
while (true) { // 创建无限循环来模拟等待资源
synchronized (resource2) { // 确保资源2在任何时候都只被一个线程访问
if (resource2.equals(resource2)) { // 如果资源2可用,获取并释放资源
resource2 = new Object();
System.out.println("Thread A acquired resource 2");
break;
}
}
}
}
public void threadB() {
while (true) { // 创建无限循环来模拟等待资源
synchronized (resource1) { // 确保资源1在任何时候都只被一个线程访问
if (resource1.equals(resource1)) { // 如果资源1可用,获取并释放资源
resource1 = new Object();
System.out.println("Thread B acquired resource 1");
break;
}
}
}
}
public static void main(String[] args) {
DeadlockExample example = new DeadlockExample();
Thread threadA = new Thread(example::threadA));
Thread threadB = new Thread(example::threadB));
threadA.start();
threadB.start();
try {
threadA.join(); // 等待线程A结束
threadB.join(); // 等待线程B结束
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
以上例子展示了Java中常见的死锁问题,以及如何通过synchronized关键字来避免死锁。
还没有评论,来说两句吧...