- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
* 多线程的同步处理 -多线程共享内存引发的问题(2) 多线程访问共享内存引发问题的例程(J_ThreadSum.java, P402):加减法失败。 程序分析: 1)m_data是类静态成员域,实际是上t1和t2的共享数据; 2)t1和t2的并发运行会导致加1或减1的操作无法正确完成。 * 多线程的同步处理 -多线程同步的基本原理(1) 为了正确地并发访问共享数据,Java虚拟机采用了锁机制来实现多线程的同步处理。 Java虚拟机既可对实例对象加锁,也可对类对象加锁。 类对象的引用可通过类java.lang.Class的如下成员方法获取: 静态成员属于类对象,非静态成员属于实例对象。 public static Class forName(String className) throws ClassNotFoundException * 多线程的同步处理 -多线程同步的基本原理(2) 锁机制原理示意图 * 多线程的同步处理 -多线程同步的基本原理(3) 锁机制原理:Java虚拟机为每个对象配备了一把锁(lock)和一个等候集(wait set)。对于每个加锁对象,实际锁住的是一些同步方法和同步语句块。 通过锁机制,可确保任何同一时刻内最多只有一个线程能够运行与该对象相关联的同步方法和同步语句块。 1)同步方法只要在方法前加上Synchronized即可。 2)同步语句块语法格式如下: Synchronized( 引用类型的表达式 ){ 语句块。 } 说明:引用类型的表达式可指向类对象或实例对象。 * 多线程的同步处理 -多线程同步的基本原理(4) 线程可通过在同步方法或同步语句块中调用java.lang.Object的notify和notifyAll方法来激活等候集中的线程。 如果线程在等候集中的timeout时限已到,则该线程会自动被激活,进入就绪态。 原型 描述 public final void notify( ) 随机激活等候集中的一个线程 public final void notifyAll( ) 激活等候集中的所有线程 线程可通过在同步方法或同步语句块中调用java.lang.Object的wait方法来进入加锁对象的等候集。 原型 描述 public final void wait( ) throws InterruptedException 当前线程进入等候集 public final void wait( long timeout) throws InterruptedException 当前线程进入等候集,最长等待时间为timeout毫秒 public final void wait( long timeout, int nanos ) throws InterruptedException 当前线程进入等候集,最长等待时间为timeout毫秒+nanos纳秒 * 多线程的同步处理 -多线程同步中的静态方法和非静态方法 静态的同步方法受类对象锁控制;非静态的同步方法受实例对象锁的控制。 示例:J_SynchronizedStatic.java, P406 程序分析: 1)线程t[0]和t[1]可同时进入非静态的同步方法mb_methodSynchronized,因为非静态的同步方法隶属于实例对象。 2)线程t[0]和t[1]不能同时进入静态的同步方法mb_methodStatic,因为静态的同步方法隶属于类对象。 * 多线程的同步处理 -多线程同步中的同一个对象的多个同步方法 多个同步方法与一个类对象或实例对象相关联,则任何一个时刻最多只有一个线程能够进入这些同步方法。 示例:J_SynchronizedMethod.java, P410 程序分析: 1)类J_Experiment有个两个非静态的同步方法:mb_method1和mb_method2。 2)线程t[0]和t[1]在同一时刻只能有一个能够进入mb_method1或mb_method2,即不会同时出现t[0]进入mb_method1,t[1]进入mb_method2及其类似的情形。 * 多线程的同步处理 -多线程同步中的同步语句块(1) 基于类对象的同步语句块示例:J_BlockClass.java, P413 程序分析: 1)类J_BlockCass有个两个静态的成员域:m_data和m_times。 2)由于是共享访问静态成员域,因此只能对类对象加锁。 3)类对象的引用通过如下语句实现:Class.forName(“J_BlockClass”) 4)通过使用同步语句
文档评论(0)