- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实现基于锁对象和条件对象的帐号交易
(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时,它们会被阻塞,直到第一个线程释放锁对象。
??? 让我们使用锁对象来保护Bank类的transfer方法。
??? public class Bank
??? {
????? public void? transfer(int from, int to, int amount)
????? {
????????? bankLock.lock();
????????? try
????????? {
???????????? if(accounts[from]amount) return;
???????????? 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());
????????? }
??????????finally
????????? {
????????????? bankLock.unlock();
???????????}
?????? }
???????...
??????private Lock bankLock = new ReentrantLock();
//ReentrantLock implements the Lock interface
}
??? 注意每一个Bank对象都有它自己的ReentrantLock对象。如果两个线程试图访问同一个Bank对象,锁就会串行的服务于访问。但是,如果两个线程访问不同的Bank对象,那么每一个线程都会得到一个不同的锁,两者都不会发生阻塞。
??? 锁是可重入的,因为线程能够重复的获取它已经拥有的锁。锁对象维护一个持有技术(hold count)来追踪对lock方法的嵌套调用。线程在每次调用lock后都要调用unlock来释放锁。由于这个特性,被一个锁保护的代码可以调用另一个使用相同的锁的方法。
??? 例如,transfer方法调用getTotalBalance方法,这也会锁住bankLock对象,现在该bankLock对象的持有数是2。当getTotalBalance方法退出后,持有数变回1.当transfer方法退出后,持有数变为0,线程就把锁释放了。
2. 条件对象
??? 条件变量(condition variable)在Java中叫作条件对象(condition object)。你要使用一个条件对象来管理那些已获得了锁却不能开始执行有用的工作的线程。???
??? 让我们来精化那个银行模拟程序。我们不希望选择余额不足以进行转账的帐户作为转出帐户。注意,我们不能用下面这样的代码。
???? if(bank.getBalance(from)=amount)
??????? bank.transfer(from,to,amount);
??? 当前线程完全有可能在条件语句检查成功后,并在transfer被调用之前被中断。
???? if(bank.getBalance(from)=amount)
??????? //thread might be deactivated at this point
??????? bank.transfer(from,to,amount);
???? 在线程再次运行前,帐户余额可能已经小于要提出的金额。将检查和转账动作用一个锁保护起来就可以达到目的:
???? public void transfer(int from, int to, int amount)
文档评论(0)