文档详情

Java程序设计(十一).ppt

发布:2019-01-01约8.48千字共34页下载文档
文本预览下载声明
* 多线程的同步处理 -多线程共享内存引发的问题(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)通过使用同步语句
显示全部
相似文档