以下是一个简单的示例程序,其中包含一个银行账户类 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 中的多线程同步机制,以及如何使用它来保护共享资源,确保并发访问时数据的正确性和一致性。

Java 多线程同步机制示例:模拟会计和出纳并发访问银行账户

原文地址: https://www.cveoy.top/t/topic/jmjp 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录