Java多线程:同步和死锁示例
在Java编程中,多线程可以通过synchronized关键字实现同步机制。同时,死锁是多线程中的一个严重问题。下面我们将通过两个示例来理解这些概念。
示例1:使用synchronized
实现简单同步
public class Counter {
private int count = 0;
public synchronized void increment() {
count++;
}
public synchronized int decrement() {
if (count > 0) {
count--;
return count;
} else {
throw new RuntimeException("Cannot decrement from zero");
}
}
// Getter for count
public synchronized int getCount() {
return count;
}
}
在这个示例中,我们创建了一个Counter
类,其中包含了共享的计数器。我们通过synchronized
关键字确保同一时刻只有一个线程可以访问这些方法。
示例2:死锁的产生
public class BankAccount {
private String accountNumber;
private double balance;
public synchronized void deposit(double amount) {
if (amount > 0) {
balance += amount;
}
}
// Getter for balance
public synchronized double getBalance() {
return balance;
}
// Getter for account number
public synchronized String getAccountNumber() {
return accountNumber;
}
// Method to transfer money between accounts
public synchronized void transferMoney(String recipientAccount, double amount) throws InsufficientFundsException {
if (accountNumber != null && recipientAccount != null) {
// Check sender's balance
double senderBalance = getBalance();
if (amount > senderBalance) {
throw new InsufficientFundsException("Insufficient funds to transfer " + amount);
}
// Transfer money
balance -= amount;
System.out.println("Money transferred from account " + this.getAccountNumber() + " to account " + recipientAccount + ". Amount transferred: " + amount);
// Check receiver's balance
double receiverBalance = getRecipientBankAccount().getBalance();
if (receiverBalance + amount < 0) {
throw new InsufficientFundsException("Receiver's balance insufficient after transfer. Amount remaining: " + (-receiverBalance - amount)));
}
} else {
throw new IllegalArgumentException("Invalid account number or recipient account");
}
}
}
在这个示例中,我们创建了两个类:BankAccount
和一个内部类Counter
。银行账户有两个方法:存款和获取余额。同时,Counter
类包含了计数器的增减操作。
在transferMoney
方法中,如果发送方的余额不足以转账,则会抛出InsufficientFundsException
。这就可能产生死锁,因为两个线程可能会阻塞等待对方释放资源,从而导致无法继续执行。
通过这两个示例,我们可以理解Java多线程中的同步和死锁问题,并能针对实际情况进行处理。
还没有评论,来说两句吧...