如下的代码,如果使用多线程调用的话。我知道syncTransfer的方法体同时只能有一个线程执行它。但是有没有可能另外一个线程在这个方法体执行的时候调用另外的方法修改了 accounts[from] 的值呢?
public void syncTransfer(int from, int to, double amount) {
lock.lock();
try {
while (accounts[from] < amount) {
sufficientFunds.await();//满足条件钱不再向下执行同时释放锁。
}
System.out.print(Thread.currentThread());
accounts[from] -= amount;
System.out.println("从" + from + "转到" + to + "金额" + amount);
accounts[to] += amount;
System.out.println("当前银行一共金额" + getTotalBalance());
sufficientFunds.signalAll(); //唤醒所有等待这个锁的线程
} catch (Exception e) {
System.err.println(e.getStackTrace());
} finally {
//必须释放锁
lock.unlock();
}
}
你这好像是
lock
没用syschronized
吧……你的担忧是对的,所以严格上来说是给每个会被多线程读写的对象加锁,而不是纯的给方法加锁(方法加锁的目的也是为了给对象加锁)。