并发编程难题:Java多线程锁竞争和死锁案例
在Java的多线程环境中,锁竞争和死锁是常见的并发问题。下面分别给出这两种情况的例子。
锁竞争(Race Condition):
假设有一个共享资源(如变量count),两个线程A和B同时访问这个资源。如果它们的操作没有明确的顺序关系,就可能导致竞态条件。例如代码:
class Counter {
int count = 0;
synchronized void increment() {
count++;
}
synchronized int get() {
return count;
}
}
在这里,线程A和B同时调用increment()方法。如果两个线程操作的顺序不明确,就可能发生锁竞争。
死锁(Deadlock):
死锁通常发生在多个线程相互等待对方释放资源的情况下。这种情况下无法推进任何事务,导致系统陷入僵死状态。例如代码:
class BankAccount {
int money = 0;
Object lock1, lock2;
synchronized void deposit(int amount) {
lock1.lock();
try {
money += amount;
} finally {
lock1.unlock();
}
lock2.lock();
try {
// 如果账户余额足够,执行转账操作
if (money >= amount) {
money -= amount;
System.out.println("成功转出 " + amount);
} else {
System.out.println("账户余额不足,无法完成转账");
}
} finally {
lock2.unlock();
}
}
synchronized void withdraw(int amount) {
lock1.lock();
try {
// 检查账户余额是否足够
if (money >= amount) {
money -= amount;
System.out.println("成功取出 " + amount);
} else {
System.out.println("账户余额不足,无法完成取款");
}
} finally {
lock1.unlock();
}
}
}
在这里,两个线程A和B分别调用withdraw()方法和deposit()方法。如果两个线程操作的顺序不明确,就可能出现死锁,因为每个线程都在等待对方释放资源。
还没有评论,来说两句吧...