2022年银行并发lock问题 .pdf
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《2022年银行并发lock问题 .pdf》由会员分享,可在线阅读,更多相关《2022年银行并发lock问题 .pdf(7页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实现基于锁对象和条件对象的帐号交易(2007-05-01 11:55:59) 1. 锁对象用 ReentrantLock 保护代码块的基本结构如下:myLock.lock();/a ReentrantLock object try critical section finally myLock.unlock(); /make sure the lock is unlocked even if n exception is thrown 这种结构保证在任何时刻只有一个线程能够进入临界区。一旦一个线程锁住了锁对象,其他任何线程都无法通过lock 语句。当其他线程调用lock 时,它们会被阻塞,直到
2、第一个线程释放锁对象。让我们使用锁对象来保护Bank 类的 transfer 方法。public class Bank public void transfer(int from, int to, int amount) bankLock.lock(); try if(accountsfrom=amount) bank.transfer(from,to,amount); 当前线程完全有可能在条件语句检查成功后,并在transfer 被调用之前被中断。if(bank.getBalance(from)=amount) /thread might be deactivated at this poi
3、nt bank.transfer(from,to,amount); 在线程再次运行前,帐户余额可能已经小于要提出的金额。将检查和转账动作用一个锁保护起来就可以达到目的:public void transfer(int from, int to, int amount) bankLock.lock(); try 来源: (http:/ - 实现基于锁对象和条件对象的帐号交易 _myown 程序世界 _新浪博客 while(accountfromamount) /wait . /transfer . finally bankLock.unlock(); 现在,如果帐户中没有足够的余额该怎么办?我们
4、将等待,直到其他某个线程向帐户存款为止。但这个线程刚获得了对bankLock 的排他性访问,这种访问是互斥的,就是说没有其他任何线程能够有机会进行存款操作,这就是为什么我们需要条件对象的原因。一个锁对象可以有一个或多个相关联的条件对象。你可以通过newCondition 方法来获得名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - - - - - - 名师精心整理 - - - - - - - 第 2 页,共 7 页 - - - - - - - - - 一个条件对象, 习惯上,我们给每一个条件对象都取一个形象的名字来反映它所代表的条件。例如,下面我们设置
5、了一个条件对象来代表“ 余额足够 ” 这个条件。class public Bank() . sufficientFunds = bankLock.newCondition(); . private Condition sufficientFunds; 如果 transfer 方法发现余额不足,它调用sufficientFunds.await(); 当前线程现在被阻塞了,并且放弃了锁。我们希望这样可以使另一个线程能够增加帐户余额的操作。当另一个线程到帐时,它应该调用sufficientFunds.signalAll(); 这个调用解除所有等待此条件的线程的阻塞状态。当线程从等待集中被移走时,他们
6、将再次成为可运行的,调度器将再次激活它们。此时,他们将试图重新进入对象。一旦锁可获得,它们中的某个线程将从await 调用返回,从而获得锁并从它被阻塞的地方继续执行。此外,线程个再次测试条件。因为现在还不能确保条件已经满足。signalAll方法仅仅是通知等待的线程:现在条件可能已经满足了,你值得再去测试一下条件。最终必须要有某个其他的线程调用signalAll方法,这一点很重要。那么应该何时调用signalAll方法呢?一般的原则是当对象的状态向着有利于等待线程的方向变化时调用signalAll 。例如,当一个帐户余额发生变化时,等待线程应该有机会去检查余额。在我们的例子中,在完成转账后调用
7、了signalAll 。public void transfer(int from, int to,int amount) bankLock.lock(); try while(accountsfromamount) sufficientFunds.await(); /transfer funds . sufficientFunds.signalAll(); finally bankLock.unlock(); 需要注意的是对signalAll 的调用不会立即激活等待线程。它只是解除等待线程的阻塞状名师资料总结 - - -精品资料欢迎下载 - - - - - - - - - - - - - -
8、 - - - - 名师精心整理 - - - - - - - 第 3 页,共 7 页 - - - - - - - - - 态,这样这些线程可以在当前线程退出同步方法后,通过竞争获得对对象的访问。SynchBankTest.java /* version 1.30 2004-08-01 author Cay Horstmann */ import java.util.concurrent.locks.*; /* This program shows how multiple threads can safely access a data structure. */ public class Sy
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 2022年银行并发lock问题 2022 银行 并发 lock 问题
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内