Java多线程:同步和死锁示例

原创 迈不过友情╰ 2024-10-10 12:36 145阅读 0赞

在Java编程中,多线程可以通过synchronized关键字实现同步机制。同时,死锁是多线程中的一个严重问题。下面我们将通过两个示例来理解这些概念。

示例1:使用synchronized实现简单同步

  1. public class Counter {
  2. private int count = 0;
  3. public synchronized void increment() {
  4. count++;
  5. }
  6. public synchronized int decrement() {
  7. if (count > 0) {
  8. count--;
  9. return count;
  10. } else {
  11. throw new RuntimeException("Cannot decrement from zero");
  12. }
  13. }
  14. // Getter for count
  15. public synchronized int getCount() {
  16. return count;
  17. }
  18. }

在这个示例中,我们创建了一个Counter类,其中包含了共享的计数器。我们通过synchronized关键字确保同一时刻只有一个线程可以访问这些方法。

示例2:死锁的产生

  1. public class BankAccount {
  2. private String accountNumber;
  3. private double balance;
  4. public synchronized void deposit(double amount) {
  5. if (amount > 0) {
  6. balance += amount;
  7. }
  8. }
  9. // Getter for balance
  10. public synchronized double getBalance() {
  11. return balance;
  12. }
  13. // Getter for account number
  14. public synchronized String getAccountNumber() {
  15. return accountNumber;
  16. }
  17. // Method to transfer money between accounts
  18. public synchronized void transferMoney(String recipientAccount, double amount) throws InsufficientFundsException {
  19. if (accountNumber != null && recipientAccount != null) {
  20. // Check sender's balance
  21. double senderBalance = getBalance();
  22. if (amount > senderBalance) {
  23. throw new InsufficientFundsException("Insufficient funds to transfer " + amount);
  24. }
  25. // Transfer money
  26. balance -= amount;
  27. System.out.println("Money transferred from account " + this.getAccountNumber() + " to account " + recipientAccount + ". Amount transferred: " + amount);
  28. // Check receiver's balance
  29. double receiverBalance = getRecipientBankAccount().getBalance();
  30. if (receiverBalance + amount < 0) {
  31. throw new InsufficientFundsException("Receiver's balance insufficient after transfer. Amount remaining: " + (-receiverBalance - amount)));
  32. }
  33. } else {
  34. throw new IllegalArgumentException("Invalid account number or recipient account");
  35. }
  36. }
  37. }

在这个示例中,我们创建了两个类:BankAccount和一个内部类Counter。银行账户有两个方法:存款和获取余额。同时,Counter类包含了计数器的增减操作。

transferMoney方法中,如果发送方的余额不足以转账,则会抛出InsufficientFundsException。这就可能产生死锁,因为两个线程可能会阻塞等待对方释放资源,从而导致无法继续执行。

通过这两个示例,我们可以理解Java多线程中的同步和死锁问题,并能针对实际情况进行处理。

文章版权声明:注明蒲公英云原创文章,转载或复制请以超链接形式并注明出处。

发表评论

表情:
评论列表 (有 0 条评论,145人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java线同步示例

    在Java多线程编程中,死锁是一种常见的并发问题。当两个或更多的线程相互等待对方释放资源时,就会发生死锁。 以下是一个简单的Java死锁示例: ```java // 创建两