【发布时间】:2019-05-15 05:45:28
【问题描述】:
我创建了一个小应用程序,其中基本上包括用于帐户之间转账的 rest APIs。为简单起见,我对数据存储使用了并发 hashmap。现在要实现的非常基本的概念是多线程。
由于我没有使用任何数据库,因此我使用可重入锁在 Account 类本身上创建了锁。现在,当我进行交易时,我获得了两个帐户对象(即发送者和接收者)的锁定,然后将其传递给 biconsumer.accept()。
我不确定这是否完全正确(仅就本应用而言)。 也不确定如何为此进行单元测试。
帐户.java
public class Account {
private ReentrantLock lock = new ReentrantLock();
private String accountNumber;
private long accountBalance;
public String getAccountNumber() {
return accountNumber;
}
public void setAccountNumber(String accountNumber) {
this.accountNumber = accountNumber;
}
public long getAccountBalance() {
return accountBalance;
}
public void setAccountBalance(long accountBalance) {
this.accountBalance = accountBalance;
}
public void getLock() {
this.accountLock.lock();
}
public void doUnlock() {
this.accountLock.unlock();
}
}
Transfer.java
send(senderAccount, receiverAccount, (x, y) -> {
senderAccount.setAccountBalance(senderAccount.getAccountBalance() - (transferAmount));
receiverAccount.setAccountBalance(toAccountDto.getAccountBalance() + transferAmount));
});
public void send(Account senderAccount, Account receiverAccount,
BiConsumer<Account, Account> action) {
senderAccount.lock();
try {
receiverAccount.lock();
try {
biConsumer.accept(senderAccount, receiverAccount);
} finally {
receiverAccount.unlock();
}
} finally {
senderAccount.unlock();
}
}
就单线程而言,这可以正常工作。 但是我如何对它进行单元测试以检查它是否适用于 10000 个线程。
这个帐户级别锁定也是一个好习惯(就这个应用程序而言),或者我可以做其他事情?
【问题讨论】:
-
好的。那将是出于测试目的。但是,如果我这样锁定,这是正确的吗?
-
如果两个账户互相汇款,就会出现死锁。
-
@JohannesKuhn 我想如果我使用 tryLock(5000, TimeUnit.SECONDS);这应该可以解决问题。对吗?
-
那么你也必须检查返回值。锁是一罐蠕虫。当第一个锁成功而第二个失败时,你应该怎么做?解锁第一个?等待?多久? (一些随机时间可能是最好的答案)。您的系统很快就会变得如此复杂,以至于难以推理。
标签: java multithreading junit reentrantlock