chen_xiang_wei123 2011-05-23 16:52
浏览 196
已采纳

java 核心技术 卷一中多线程代码的同步问题请教

在看java核心编程思想中的多线发现如下代码:
[code="java"]
/**
* Transfers money from one account to another.
* @param from the account to transfer from
* @param to the account to transfer to
* @param amount the amount to transfer
*/
public void transfer(int from, int to, double amount) throws InterruptedException
{
bankLock.lock();
try
{
while (accounts[from] < amount)
sufficientFunds.await();
System.out.print(Thread.currentThread());
accounts[from] -= amount;
System.out.printf(" %10.2f from %d to %d", amount, from, to);
accounts[to] += amount;
System.out.printf(" Total Balance: %10.2f%n", getTotalBalance());
sufficientFunds.signalAll();
}
finally
{
bankLock.unlock();
}
}

/**
* Gets the sum of all account balances.
* @return the total balance
*/
public double getTotalBalance()
{
bankLock.lock();
try
{
double sum = 0;

     for (double a : accounts)
        sum += a;

     return sum;
  }
  finally
  {
     bankLock.unlock();
  }

}

[/code]

请问一下,getTotalBalance()方法中,需要加锁吗?期待您的回答。

  • 写回答

1条回答

  • fmjsjx 2011-05-23 17:06
    关注

    楼主可能对于锁的理解有点偏差,锁并不是锁住lock和unlock之间的对象或代码什么的,锁其实锁住的是所本身。这样讲吧,锁的机制其实很简单,就是执行到lock()时去获取锁,如果锁在之前另一个线程已近lock()了(就是已经被其他线程获取了),那么当前线程就会等待,直到改锁被释放。像这个例子里,getTotalBalance()里不加锁,那么代码就不会去获取锁,而是会直接执行下去,那就有可能出现线程冲突。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 安卓adb backup备份应用数据失败
  • ¥15 eclipse运行项目时遇到的问题
  • ¥15 关于#c##的问题:最近需要用CAT工具Trados进行一些开发
  • ¥15 南大pa1 小游戏没有界面,并且报了如下错误,尝试过换显卡驱动,但是好像不行
  • ¥15 没有证书,nginx怎么反向代理到只能接受https的公网网站
  • ¥50 成都蓉城足球俱乐部小程序抢票
  • ¥15 yolov7训练自己的数据集
  • ¥15 esp8266与51单片机连接问题(标签-单片机|关键词-串口)(相关搜索:51单片机|单片机|测试代码)
  • ¥15 电力市场出清matlab yalmip kkt 双层优化问题
  • ¥30 ros小车路径规划实现不了,如何解决?(操作系统-ubuntu)