Java 多线程同步机制示例:模拟会计和出纳并发访问银行账户
以下是一个简单的示例程序,其中包含一个银行账户类 BankAccount,一个会计类 Accountant 和一个出纳类 Cashier。会计和出纳都可以并发地访问银行账户信息,但是在任何时候只有一个线程可以修改账户余额。
public class BankAccount {
private double balance;
public BankAccount(double balance) {
this.balance = balance;
}
public double getBalance() {
return balance;
}
public synchronized void deposit(double amount) {
balance += amount;
}
public synchronized void withdraw(double amount) {
balance -= amount;
}
}
public class Accountant implements Runnable {
private BankAccount account;
public Accountant(BankAccount account) {
this.account = account;
}
public void run() {
for (int i = 0; i < 10; i++) {
double amount = Math.random() * 1000;
account.deposit(amount);
System.out.println('Accountant deposited ' + amount + ', balance is ' + account.getBalance());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Cashier implements Runnable {
private BankAccount account;
public Cashier(BankAccount account) {
this.account = account;
}
public void run() {
for (int i = 0; i < 10; i++) {
double amount = Math.random() * 100;
account.withdraw(amount);
System.out.println('Cashier withdrew ' + amount + ', balance is ' + account.getBalance());
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public class Main {
public static void main(String[] args) {
BankAccount account = new BankAccount(1000);
Accountant accountant = new Accountant(account);
Cashier cashier = new Cashier(account);
Thread accountantThread = new Thread(accountant);
Thread cashierThread = new Thread(cashier);
accountantThread.start();
cashierThread.start();
}
}
在这个示例程序中,BankAccount 类中的 deposit() 和 withdraw() 方法都被标记为 synchronized,这意味着在任何时候只有一个线程可以执行这些方法。这是因为这些方法都修改了共享的 balance 变量,因此需要使用同步机制来避免并发访问导致的数据不一致性。
在 Accountant 和 Cashier 类中,分别使用了 deposit() 和 withdraw() 方法来修改银行账户的余额。由于这些方法都是同步的,因此在任何时候只有一个线程可以修改账户余额。这确保了并发访问时数据的一致性。
在 Main 类中,创建了一个 BankAccount 对象和两个线程,分别代表会计和出纳。这两个线程并发地访问银行账户信息,但是由于同步机制的保护,不会导致数据不一致性的问题。
通过这个示例程序,可以更好地理解 Java 中的多线程同步机制,以及如何使用它来保护共享资源,确保并发访问时数据的正确性和一致性。
原文地址: https://www.cveoy.top/t/topic/jmjp 著作权归作者所有。请勿转载和采集!