- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
《第11章线程同步
假设出现下面情况: 线程a利用push()方法向堆栈添加一个数据,b则利用pop()方法从堆栈中取出数据。 在操作之前:data=p,q , idx=2; 线程a执行push方法中的第1条语句,将r推入堆栈,则data=p,q,r , idx=2。 在线程a还未执行idx++语句时,线程a的执行被线程b中断,b执行pop 方法,并返回q,idx=1,data=p,q,r。 线程a继续执行push方法的第2个语句,data=p,q,r,idx=2,最后的结果相当于r没有进栈。 Java中引入了对象互斥锁的概念来保证多线程间共享数据操作的完整性;每个对象都带有一个monitor标志,相当于一个锁,在任一时刻,只能有一个线程获得该互斥锁,获得了该锁的线程才能操作该对象。 使用synchronized关键词为共享资源加锁来解决同步问题。这个锁使得共享资源对线程是互斥操作的,称为互斥锁。 synchronized可修饰一个代码块或一个方法,使修饰对象在任一时刻只能有一个线程访问: 使用同步方法 synchronized void methodA() { } 使用同步块 synchronized(object) { //要同步的语句 } 加了关键字 synchronized 方法的所有代码行,或 synchronized(xxx) 括起来的代码块称为临界区。 Java运行系统允许已经拥有某个对象锁的线程再次获得该对象的锁。即对象加锁具有可重入性。 说明: 类Reentrant定义了两个带有synchronized的方法,分别是a()和b()。在Reentrant类的main方法中,对Reentrant类的实例r调用了方法a():r.a(),在a()中将调用b()。 r.a()的执行过程中, 线程的控制将首先请求并获得r的锁,并开始执行a()方法。由b()的定义可知,线程需要首先获得r的对象锁才能运行该方法,而此时r的锁已经由该线程获得,根据java对象锁的可重入性,该线程将再次获得r的锁,开始方法b()的运行。 综合实例: 模拟银行中的多个线程同时对同一个储蓄账户进行存款、取款操作。在程序中使用了一个简化版本的Account类,代表了一个银行账户的信息。在主程序中首先生成John的账户,余额为1000元,然后生成了1000个线程启动它们,每一个线程都对John的账户进行存100元,然后马上又取出100元。这样,对于John的账户来说,最终账户的余额应该是还是1000元才对。 示例:AccountTest.java 第11章 线程同步 JSP基础知识 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd. 11.1 线程同步 可将单线程程序想象成一种孤立的实体,它能遍历我们的问题空间,而且一次只能做一件事情。由于只有一个实体,所以永远不必担心会有两个实体同时试图使用相同的资源,就象两个人同时都想停到一个车位,同时都想通过一扇门,甚至同时发话。 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd. 进入多线程环境后,它们再也不是孤立的。可能会有两个甚至更多的线程试图同时访问同一个有限的资源。多线程并发访问的资源叫做临界资源。 例如,一个线程可能尝试从一个文件中读取数据,而另一个线程则尝试在同一文件中修改数据。 在此情况下,数据可能会变得不一致 为了确保在任何时间点一个共享的资源只被一个线程使用,Java使用了“同步”机制。 11.1 线程同步 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd. 数据的不同步而可能引发的错误通常不易察觉 可能是在程序执行了几千几万次之后,才会发生错误 这通常会发生在产品已经上线之后,甚至是程序已经执行了几年之后 11.1 线程同步 Evaluation only. Created with Aspose.Slides for .NET 3.5 Client Profile 5.2.0.0. Copyright 2004-2011 Aspose Pty Ltd. class MyStack { private int idx = 0;
原创力文档


文档评论(0)