21xrx.com
2024-09-20 05:42:01 Friday
登录
文章检索 我的文章 写文章
Java多线程共享同一资源的代码实例
2023-06-28 07:16:45 深夜i     --     --
Java 多线程 共享资源 代码实例 资源同步

在Java编程中,多线程是一种非常常用的技术。正因为如此,Java程序员需要深入了解多线程技术,特别是在多线程共享相同资源的情况下,需要确保线程安全性,以避免出现意外的程序行为。本文将通过一个代码示例来介绍Java中多线程共享同一资源的实现方法。

这个代码示例模拟了一个银行账户的处理过程,该银行账户具有存款和取款的功能。多个线程可以同时存款或取款,并且需要确保操作的正确性和安全性。代码如下所示:


public class BankAccount {

  private double balance;

  public BankAccount(double initialBalance)

    balance = initialBalance;

  

  public synchronized void deposit(double amount) {

    balance += amount;

  }

  public synchronized void withdraw(double amount)

    balance -= amount;

  

  public double getBalance()

    return balance;

  

}

public class BankTransaction implements Runnable {

  private BankAccount account;

  public BankTransaction(BankAccount account)

    this.account = account;

  

  public void run() {

    for (int i = 0; i < 10; i++) {

      account.deposit(10);

      double balance = account.getBalance();

      System.out.println(Thread.currentThread().getName() + " deposit $10, balance: " + balance);

      

      account.withdraw(5);

      balance = account.getBalance();

      System.out.println(Thread.currentThread().getName() + " withdraw $5, balance: " + balance);

    }

  }

  public static void main(String[] args) {

    BankAccount account = new BankAccount(100);

    BankTransaction transaction = new BankTransaction(account);

    Thread t1 = new Thread(transaction);

    Thread t2 = new Thread(transaction);

    t1.start();

    t2.start();

  }

}

在这个示例中,我们定义了一个BankAccount类和一个BankTransaction类。BankAccount类代表银行账户,具有存款、取款和查询余额的功能。BankTransaction类代表银行账户的交易过程,通过多线程模拟了账户的并发操作。

在BankAccount类中,我们使用了synchronized关键字来确保deposit()和withdraw()方法的原子性操作,以保证每个线程对数据的修改在同一时间只有一个线程进行。而getBalance()方法并没有使用synchronized关键字,因为它只是读取数据,不会对数据进行修改。

在BankTransaction类中,我们实现了Runnable接口来定义多个线程并发访问银行账户的操作。在run()方法中,我们调用了BankAccount类的deposit()和withdraw()方法来进行存款和取款的操作。通过调用Thread.currentThread().getName()方法来获取当前线程的名称,并打印账户余额的信息。

在main()方法中,我们创建了一个BankAccount对象和一个BankTransaction对象,并用两个线程分别执行它的run()方法。这样可以模拟多个用户同时访问银行账户的场景。

总之,Java中多线程共享同一资源的处理需要考虑线程安全问题,通过synchronized关键字来确保数据的原子性操作,进而保证多个线程之间的正确性和安全性。在实际的开发中,我们需要根据具体的场景和需求来选择合适的技术来实现多线程编程。

  
  

评论区

{{item['qq_nickname']}}
()
回复
回复