gpt4 book ai didi

java - 使用线程池同步银行java

转载 作者:行者123 更新时间:2023-12-03 12:47:12 25 4
gpt4 key购买 nike

我想在 Java 中使用线程创建一个简单的银行。但是我不能让 deposit(), withdraw() 同步。始终没有同步平衡。我写方法名称中的“同步”关键字,但它永远不会起作用。另外,我在我的 ArrayList 中制作了“synchronizedList”(我应该使用数组列表来制作它)但它从来没有用过。我怎样才能获得适当的平衡?请帮助我。

import java.security.SecureRandom;

public class Transaction implements Runnable {

private static final SecureRandom generator = new SecureRandom();
private final int sleepTime; // random sleep time for thread
private String transaction;
private int amount;
private static int balance;
private Account account = new Account();

public Transaction (String transaction, int amount) {
this.transaction = transaction;
this.amount = amount;
sleepTime = generator.nextInt(2000);
}

@Override
public void run() {
// TODO Auto-generated method stub
try {
if(transaction == "deposit") {
balance = account.deposit(amount);

} else if (transaction == "withdraw") {
balance = account.withdraw(amount);
}

System.out.println("[" + transaction + "] amount : " + amount +" balance : " + balance);
Thread.sleep(sleepTime);

}catch (InterruptedException e) {
e.printStackTrace();
Thread.currentThread().interrupt(); // re-interrupt the thread
}

}

}

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class AccountTest {

public static void main(String[] args) {
// TODO Auto-generated method stub

// create ArrayList
List<Transaction> john = Collections.synchronizedList(new ArrayList<>());

// add Transaction objects
john.add(new Transaction("deposit", 1000));
john.add(new Transaction("withdraw", 500));
john.add(new Transaction("withdraw", 200));
john.add(new Transaction("deposit", 3000));

// execute Thread Pool
ExecutorService executorService = Executors.newCachedThreadPool();

// start transactions
for(int i=0; i<john.size(); i++) {
executorService.execute(john.get(i));
}

// shut down Thread Pool
}
}

public class Account {
// deposit withdraw
private static int balance;

public synchronized int deposit(int amount) {
balance += amount;
return balance;
}

public synchronized int withdraw(int amount) {
balance -= amount;
return balance;
}
}

最佳答案

这里的核心错误是每个交易都有自己的账户。每个线程都在其自己的 Account 实例上获取锁,结果没有进行实际的锁定。

您需要一个在线程之间共享的锁,它们需要尝试修改同一个 Account 对象。标有 synchronized 的实例方法会获取对象实例中的锁。

使帐户余额静态化是一种肮脏的技巧,它使所有余额数据最终都在同一个地方(只有当您只有一个帐户时才有效),但不能解决同步问题。

(您可以也将 Account 方法更改为静态方法,这将解决同步问题,因为所有线程都将获取该类的锁,而只有一个类。但是当然,一旦您需要第二个帐户,它就会停止工作,因此这不是一个很好的解决方案。)

重做这个,而不是让每个交易创建自己的账户,而是跨交易共享同一个账户对象。您可以将账户作为构造函数参数传递到交易中。

关于java - 使用线程池同步银行java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65010974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com