Java虚拟机多线程之研究

合集下载

java多线程编程实验总结与体会

java多线程编程实验总结与体会

java多线程编程实验总结与体会[Java多线程编程实验总结与体会]本次实验锻炼了我的Java多线程编程能力,让我更深入地了解了多线程编程的实现原理和技巧,同时也让我意识到在多线程环境下需要考虑的问题和注意事项。

下面我将结合具体实验内容,分享我在实践中的体会和思考。

1. 实验环境搭建在进行本次实验之前,我首先进行了实验环境的搭建。

我选择了Java SE Development Kit 8和Eclipse作为开发工具,同时也安装了JDK8的API 文档作为参考资料。

在搭建环境的过程中,我认识到Java的生态系统非常强大,附带的工具和资源也非常充足,这为我们开发和调试带来了很大的便利。

2. 多线程原理在研究多线程编程之前,我们需要对Java语言中的线程概念有一个清晰的认识。

线程是指操作系统能够进行运算调度的最小单位,是执行线程代码的路径。

在Java中,线程是一种轻量级的进程,可以同时运行多个线程。

每个线程都有自己的堆栈和局部变量,线程之间可以共享全局变量。

Java的多线程编程是通过Thread类和Runnable接口来实现的。

在实践中,我发现多线程编程最基本的原理是线程的并发执行。

多个线程可以在同一时间内执行不同的代码,提高CPU利用率,加快程序运行速度。

但是,在多线程并发执行的过程中,我们需要注意线程之间的同步问题,避免出现数据竞争和并发安全等问题。

3. 多线程的实现在Java中,我们可以通过继承Thread类或者实现Runnable接口来创建线程。

对于简单的线程,我们可以采用继承Thread类的方式来实现。

例如,在实验一中,我们在Main线程内创建了两个子线程,分别用来执行奇数和偶数的累加操作。

我们可以分别定义两个类OddThread和EvenThread继承Thread类,分别实现run()方法,用来执行具体的奇数和偶数累加操作。

然后在Main线程内创建OddThread和EvenThread 对象,并调用start()方法来启动两个线程,并等待两个线程完成操作。

java虚拟线程原理

java虚拟线程原理

java虚拟线程原理Java虚拟线程简介•Java虚拟线程是Java语言中用于并发执行任务的一种机制。

•通过利用Java虚拟机(JVM)的多线程特性,可以在一个程序中同时执行多个任务,提高程序的处理能力。

基本概念•线程:是程序中的执行单元,可以独立执行任务。

•虚拟线程:是Java中的一种特殊线程实现,由JVM管理与调度。

•并发:指多个任务同时进行,互不干扰。

•并行:指多个任务在同一时刻执行,可能相互干扰。

原理解析1. JVM线程模型•JVM是通过线程模型来实现多线程的机制。

•每个Java应用程序运行在一个独立的JVM进程中,该进程包含一个或多个线程。

•JVM线程模型包括主线程、用户线程和守护线程。

2. Java虚拟线程特点•虚拟线程是用户线程的一种特殊形式。

•用户线程是由用户创建的线程,而虚拟线程是由JVM创建和管理的线程。

•虚拟线程可以独立执行任务,也可以被其他线程调用。

3. 虚拟线程的调度和执行•虚拟线程的调度由JVM负责,JVM会根据线程的优先级、等待时间和线程资源等因素进行调度。

•虚拟线程的执行是交给JVM来处理的,JVM会通过线程调度器分配处理器资源,使得多个线程能够交替执行。

4. 线程同步与互斥•在多线程环境下,线程之间可能会访问和修改共享数据,为了保证数据的一致性和正确性,需要使用线程同步和互斥机制。

•Java提供了synchronized关键字和Lock锁等机制来实现线程的同步和互斥。

应用场景•Java虚拟线程适用于需要并发执行任务的场景。

•比如多线程下载文件、并发处理网络请求等。

优缺点总结优点•提高程序的处理能力,提升用户体验。

•可以实现任务的并发处理。

缺点•多线程编程复杂度高,容易出现线程安全问题。

•线程资源占用较高,需要合理管理和调度。

结论•Java虚拟线程是一种方便且高效的并发处理机制。

•通过了解相关原理和应用场景,我们可以更好地利用虚拟线程提升程序的性能和用户体验。

虚拟线程的实现方式•虚拟线程的实现方式有两种:基于操作系统线程和基于协程。

多线程程序实验报告(3篇)

多线程程序实验报告(3篇)

第1篇一、实验目的1. 理解多线程的概念和作用。

2. 掌握多线程的创建、同步和通信方法。

3. 熟悉Java中多线程的实现方式。

4. 提高程序设计能力和实际应用能力。

二、实验环境1. 操作系统:Windows 102. 开发工具:IntelliJ IDEA3. 编程语言:Java三、实验内容本次实验主要完成以下任务:1. 创建多线程程序,实现两个线程分别执行不同的任务。

2. 使用同步方法实现线程间的同步。

3. 使用线程通信机制实现线程间的协作。

四、实验步骤1. 创建两个线程类,分别为Thread1和Thread2。

```javapublic class Thread1 extends Thread {@Overridepublic void run() {// 执行Thread1的任务for (int i = 0; i < 10; i++) {System.out.println("Thread1: " + i);}}}public class Thread2 extends Thread {@Overridepublic void run() {// 执行Thread2的任务for (int i = 0; i < 10; i++) {System.out.println("Thread2: " + i);}}}```2. 创建一个主类,在主类中创建两个线程对象,并启动它们。

```javapublic class Main {public static void main(String[] args) {Thread thread1 = new Thread1();Thread thread2 = new Thread2();thread1.start();thread2.start();}```3. 使用同步方法实现线程间的同步。

```javapublic class SynchronizedThread extends Thread {private static int count = 0;@Overridepublic void run() {for (int i = 0; i < 10; i++) {synchronized (SynchronizedThread.class) {count++;System.out.println(Thread.currentThread().getName() + ": " + count);}}}}public class Main {public static void main(String[] args) {Thread thread1 = new SynchronizedThread();Thread thread2 = new SynchronizedThread();thread1.start();thread2.start();}```4. 使用线程通信机制实现线程间的协作。

Java多线程详解——一篇文章搞懂Java多线程

Java多线程详解——一篇文章搞懂Java多线程

Java多线程详解——⼀篇⽂章搞懂Java多线程⽬录1. 基本概念程序(program)程序是为完成特定任务、⽤某种语⾔编写的⼀组指令的集合。

即指⼀段静态的代码(还没有运⾏起来),静态对象。

进程(process)进程是程序的⼀次执⾏过程,也就是说程序运⾏起来了,加载到了内存中,并占⽤了cpu的资源。

这是⼀个动态的过程:有⾃⾝的产⽣、存在和消亡的过程,这也是进程的⽣命周期。

进程是系统资源分配的单位,系统在运⾏时会为每个进程分配不同的内存区域。

线程(thread)进程可进⼀步细化为线程,是⼀个程序内部的执⾏路径。

若⼀个进程同⼀时间并⾏执⾏多个线程,那么这个进程就是⽀持多线程的。

线程是cpu调度和执⾏的单位,每个线程拥有独⽴的运⾏栈和程序计数器(pc),线程切换的开销⼩。

⼀个进程中的多个线程共享相同的内存单元/内存地址空间——》他们从同⼀堆中分配对象,可以访问相同的变量和对象。

这就使得相乘间通信更简便、搞笑。

但索格线程操作共享的系统资源可能就会带来安全隐患(隐患为到底哪个线程操作这个数据,可能⼀个线程正在操作这个数据,有⼀个线程也来操作了这个数据v)。

配合JVM内存结构了解(只做了解即可)class⽂件会通过类加载器加载到内存空间。

其中内存区域中每个线程都会有虚拟机栈和程序计数器。

每个进程都会有⼀个⽅法区和堆,多个线程共享同⼀进程下的⽅法区和堆。

CPU单核和多核的理解单核的CPU是⼀种假的多线程,因为在⼀个时间单元内,也只能执⾏⼀个线程的任务。

同时间段内有多个线程需要CPU去运⾏时,CPU也只能交替去执⾏多个线程中的⼀个线程,但是由于其执⾏速度特别快,因此感觉不出来。

多核的CPU才能更好的发挥多线程的效率。

对于Java应⽤程序java.exe来讲,⾄少会存在三个线程:main()主线程,gc()垃圾回收线程,异常处理线程。

如过发⽣异常时会影响主线程。

Java线程的分类:⽤户线程和守护线程Java的gc()垃圾回收线程就是⼀个守护线程守护线程是⽤来服务⽤户线程的,通过在start()⽅法前调⽤thread.setDaemon(true)可以吧⼀个⽤户线程变成⼀个守护线程。

java多线程程序设计实验总结

java多线程程序设计实验总结

java多线程程序设计实验总结一、实验目的本次实验旨在通过编写Java多线程程序,掌握多线程编程的基本概念和技能,理解多线程程序的运行原理,提高对Java语言的熟练度。

二、实验内容本次实验分为三个部分:创建线程、线程同步和死锁。

2.1 创建线程创建线程有两种方式:继承Thread类和实现Runnable接口。

继承Thread类需要重写run方法,在run方法中编写线程执行的代码;实现Runnable接口需要实现run方法,并将其作为参数传入Thread类的构造函数中。

在创建多个线程时,可以使用同一个Runnable对象或者不同的Runnable对象。

2.2 线程同步当多个线程同时访问共享资源时,可能会出现数据不一致等问题。

为了避免这种情况,需要使用同步机制来保证各个线程之间的协调运行。

常见的同步机制包括synchronized关键字和Lock接口。

synchronized关键字可以用来修饰方法或代码块,在执行该方法或代码块时,其他所有试图访问该方法或代码块的线程都必须等待当前执行完成后才能继续执行。

Lock接口提供了更加灵活和高级的锁机制,可以支持更多种类型的锁,如读写锁、可重入锁等。

2.3 死锁死锁是指两个或多个线程在互相等待对方释放资源的情况下,都无法继续执行的现象。

死锁的发生通常由于程序设计不当或者资源分配不合理所导致。

为避免死锁的发生,可以采取以下措施:避免嵌套锁、按照固定顺序获取锁、避免长时间占用资源等。

三、实验过程本次实验我编写了多个Java多线程程序,包括创建线程、线程同步和死锁。

其中,创建线程部分我使用了继承Thread类和实现Runnable 接口两种方式来创建线程,并测试了多个线程之间的并行执行情况;在线程同步部分,我使用synchronized关键字和Lock接口来保证共享资源的访问安全,并测试了多个线程同时访问共享资源时是否会出现数据不一致等问题;在死锁部分,我编写了一个简单的死锁程序,并通过调整程序代码来避免死锁的发生。

JAVA多线程的使用场景与注意事项总结

JAVA多线程的使用场景与注意事项总结

JAVA多线程的使用场景与注意事项总结Java多线程是指在一个程序中同时运行多个线程,每个线程都有自己的执行代码,但是又共享同一片内存空间和其他系统资源。

多线程的使用场景和注意事项是我们在开发中需要关注的重点,下面将详细进行总结。

一、Java多线程的使用场景:1.提高程序的执行效率:多线程可以充分利用系统资源,将一些耗时的操作放到一个线程中执行,避免阻塞主线程,提高程序的执行效率。

2.实现并行计算:多线程可以将任务拆分成多个子任务,每个子任务分配给一个线程来执行,从而实现并行计算,提高计算速度。

3.响应性能提升:多线程可以提高程序的响应性能,比如在用户界面的开发中,可以使用多线程来处理用户的输入和操作,保证界面的流畅性和及时响应。

4.实时性要求高:多线程可以实现实时性要求高的任务,比如监控系统、实时数据处理等。

5.任务调度与资源管理:多线程可以实现任务的调度和资源的管理,通过线程池可以更好地掌控任务的执行情况和使用系统资源。

二、Java多线程的注意事项:1.线程安全性:多线程操作共享资源时,要注意线程安全问题。

可以通过使用锁、同步方法、同步块等方式来解决线程安全问题。

2.死锁:多线程中存在死锁问题,即多个线程相互等待对方释放资源,导致程序无法继续执行。

要避免死锁问题,应尽量减少同步块的嵌套和锁的使用。

3.内存泄漏:多线程中存在内存泄漏问题,即线程结束后,线程的资源没有得到释放,导致内存占用过高。

要避免内存泄漏问题,应及时释放线程资源。

4.上下文切换:多线程的切换会带来上下文切换的开销,影响程序的执行效率。

要注意合理分配线程的数量,避免过多线程的切换。

5. 线程同步与通信:多线程之间需要进行同步和通信,以保证线程之间的正确协调和数据的一致性。

可以使用synchronized关键字、wait(和notify(方法等方式进行线程同步和通信。

6.线程池的使用:在多线程编程中,可以使用线程池来管理线程的创建和销毁,可以减少线程的创建和销毁的开销,提高程序的性能。

【实验】java多线程实验报告

【实验】java多线程实验报告

【关键字】实验java多线程实验报告篇一:西北农林科技大学java多线程实验报告实验7 多线程1.实验目的(1) 掌握Java多线程的概念和实现方法(2) 掌握Java多线程的同步问题2.实验内容任务一:火车售票假设有火车票1000张,创建10个线程模拟10个售票点,每个售票点100毫秒买一张票。

打印出售票过程,注意使用synchronized确保同一张票只能卖出一次。

程序运行结果见左图。

打开EclipseTickets.javapublic class Ticket extends Thread {int ticket =1000; String name =""; public void run(){ while(true){synchronized(name){ if(ticket"第" + Thread.currentThread().getName()+ "售票点卖出了第" + ticket-- + "张票");}} }}} try{ } catch(InterruptedException e){ } Thread.sleep(100);Test.javapublic class Test {} public static void main(String args[]){} Ticket t = new Ticket(); new Thread(t,"1").start(); new Thread(t,"2").start(); new Thread(t,"3").start(); new Thread(t,"4").start(); new Thread(t,"5").start(); new Thread(t,"6").start(); new Thread(t,"7").start(); new Thread(t,"8").start(); new Thread(t,"9").start(); new Thread(t,"10").start();任务二:银行存款假设某家银行,它可接受顾客的汇款,每做一次汇款,便可计算出汇款的总额。

java 多线程理解

java 多线程理解

java 多线程理解
Java多线程是指在同一时间内,程序中有多个线程在同时执行。

这种并发性质让程序可以更有效地利用CPU资源,提高程序的响应速度和并发处理能力。

Java多线程的实现方式有两种,一种是继承Thread类,另一种是实现Runnable接口。

对于简单的多线程任务,继承Thread类更为简单,而对于复杂的任务,实现Runnable接口更为灵活。

Java多线程的核心概念包括线程安全、同步和互斥。

线程安全
是指多个线程同时调用一个对象或方法时,不会发生错误或数据损坏。

同步是指多个线程在执行时,需要互相协调和配合,确保数据的正确性和一致性。

互斥是指多个线程在访问共享资源时,需要通过加锁和释放锁来保证同一时间只有一个线程可以访问。

Java多线程的应用领域非常广泛,例如服务器端的并发处理、
多媒体处理、网络编程等等。

理解Java多线程的核心概念和实现方式,对于开发高并发、高可用的程序非常重要。

- 1 -。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
云南省应用基础研究基金资助项目 . 1997- 06- 28 收稿
532
云南大学学报 ( 自然科学版 )
第 19 卷
线程有各自的寄存器和堆栈, 同时共享同一进程地址空间内的动态数据堆、 静态数据区和 代码区. 与进程相比 , 采用多线程模式来实现多任务并发具有以下优点: ( 1) 在进程中, 各个进程拥有自己独立的运行环境 , 独占自己的系统空间 , 进程之间的 耦合度差, 并发性粒度粗糙, 且进程上下文( cont ex t) 需在两个处理机之间切换, 系统资源开 销大. 而多个线程位于同一地址空间内, 共享该地址空间的内存区, 线程间的耦合度较好, 且在同一处理机内的线程切换速度较快 . ( 2) 进程间的通信需专门的系统机制( 如消息、 邮箱、 管道等) 来完成 , 调度复杂 . 而由于 线程共享同一地址空间, 线程间共享的实现则很简单. ( 3) 进程受系统的限制很大 , 如 : 用户能拥有的进程数目通常受操作系统的限制, 多进 程并发方式往往用于主机 ( 多用户 ) 系统 . 而多线程模式则不存在这些问题 . 由于多线程的上述优点, 多线程技术得到了广泛的应用 . 近年来的许多并发程序设计 语言都采用了并发多线程技术的设计思想 ( 如 Ada, cocurrent C 等 ) , 一些操作系统 , 如 Sun OS5. 3( solaris) , Window sNT , Window s95 等都为多线程提供了内核级的支持并在其 API 中 提供了有关线程的用户程序接口. IEEE 推出了多线程设计的 IEEE POSIX1003. 4a 标准 . 多线程程序设计中, 单个程序包含着多个并发执行的线程 . 在多线程并发执行时 , 线程 间的关系有时不可预先确定, 而依赖于运行时的条件( dependence on t im ing) , 多线程并发同 样具有不确定性 ( undet ermined) . 因此 , 多线程设计的一个关键问题就是解决多线程互斥访 问临界资源的同步问题. 多线程的同步可以采用多进程的同步机制 ( 如互斥锁、 信号量、 管 程等 ) . IEEE P OSIX1003. 4a 定义了线程间的两种 同步对象: 互斥锁 ( mutex) 和 条件变量 ( condit ion variable) , 互斥锁用于线程加锁时间不太长的场合 , 条件变量类似于信号量机制, 可用于加锁时间较长的场合. 任何一种同步机制 , 实际上都需要对临界资源进行加锁访问. 我们可以把加锁的同步层次划分为以下三种 ( DCE 标准 ) : ( 1) 粗粒度 ( coarse grain) 同步 : 即几个共享资源或一个进程中的所有线程仅用一把锁, 任一时刻只有一个线程能访问该锁 . ( 2) 细粒度 ( fine grain) 同步: 每个共享资源一把锁 . 在这种方式下 , 若一个数据结构或数 据对象有 n 个数据变量 , 则需 n 把锁 . ( 3) 中粒度 ( intermedia grain) 同步: 相关的几个共享资源使用同一把锁, 如对一个对象 用一把锁 . 2 Java 语言的多线程同步机制 Java 内在地 ( built in) 支持多线程设计. Java 采用的多线程同步机制的基本原理是 C. A. R. Hoare 的临界区保护和管程机制 . 管程 ( monit or) 是由若干公共变量及其说明和所有访 问这些变量的过程组成的一段程序区. 这些过程可由多个进程互斥地调用, 在任一时刻 , 最 多只允许一个调用者能真正地进入管程, 而其它调用者必须等待 . 对象的封装与管程十分 相似, 因此 , 管程可以很容易地用对象来实现 . Java 是面向对象的程序语言 , 在 Java 中 , 线程 已不再是一个过程, 而是一个对数据和方法进行了封装的对象. 当定义了一个线程( T hread) 类的对象时 , 也就定义了一个线程. 同时, 对象封装的数据和方法在被多个线程调用时, 也
摘要 关键词 分类号
介绍多线程的有关概念及 Java 语言级的多线程机制, 并着重探讨 Java 线程, 并发多线程, Java 虚拟机 T P312
虚拟机低层的多线程机制 .
1
线程的概念及多线程同步
线程的概念起源于进程. 传统的并发多任务的实现方法是在操作系统级上运行多个进 程. _进程是操作系统调度和分配资源的基本单位 , 一个进程拥有自已的独立的运行环境 ( 寄 存器和地址空间等) . 以多线程的方法来实现多任务并发是近年来受到日益广泛关注的一 种模式 . 线程( t hread) , 又称线索 , 是比进程更小的系统调度的逻辑单位 , 一个进程可由一个 或多个线程组成 , 一个单线程的程序就是一个进程. 每个线程拥有自己的堆栈、 寄存器等资 源, 同时共享所属进程的资源 . 在并发程序设计语言中 , 线程指程序中的单一顺序控制流, 多线程( mult ithread) 即一个程序中包含多个顺序控制流, 它们之间可以并发执行 . 传统的多 进程并发的多道程序 , 就其单个程序而言, 仅是一个线程. 为了便于比较, 我们在图 1 中给出了进程 ( 单线程 ) 与多线程的程序设计模式的比较, 在图 2 中给出了 Java 虚拟机的多线程模式结构 .
3
Java 虚拟机
Java 虚拟机 ( JVM ∀ Java Virt ual Machine) 是一台抽象的计算机, 是一个执行 Java 字节
码( by tecode) 的理想硬件结构的软件仿真. 一个 Java 源程序经 Java 编译器编译后变成独立 于平台的类格式文件 , 再由 Java 虚拟机运行 . Java 虚拟机仅规定了 Java 类文件格式字节码 形式的虚拟机指令集及部分操作规范 , 而具体的实现, 如运行数据的内存布局、 垃圾收集
图1
进程与多线程程序设计模式比较
F ig 1 . T he comparison of pro gram design model betw een process and multithread
从图 1 中我们可以看出: 右图中的 n 个线程位于同一地址空间 ( address space) 内 , 每个
534
云南大学学报 ( 自然科学版 )
第 19 卷ຫໍສະໝຸດ ( garbage collect ion) 算法、 字节码优化等 , 则可根据不同的硬件平台加以优化. 用户可以用软 件采用解释执行字节码方式或把 Java 虚拟机指令编译成实际的机器指令执行方式来实现 Java 虚拟机 , 也可以通过硬件方式在微代码级或直接在 Java 芯片上实现 Java 虚拟机. Java 虚拟机构成了 Java 跨平台的关键技术 , 与一般的机器相比 , Java 虚拟机具有以下 特点 : ( 1) Java 虚拟机仅识别类文件格式的字节码, 任何以以表示成符合虚拟机规范的类文 件的语言都可以在虚拟机上使用. ( 2) Java 虚拟机直接支持独立于平台的 Java 数据类型, 且按一个抽象的 word! 字来定 义运行数据区. ( 3) Java 程序的字节码表示中, 任何对变量和方法的引用都是符号引用 , 在运行时才转 化成数值引用, 确定其实际的存储布局, 且虚拟机对对象的内部结构不作规定, 仅通过 ref erence 类型的一个句柄来引用该对象. 这样, 同一个 Java 程序不作任何改动就可以在任何 一个支持虚拟机规范的平台上运行 . ( 4) 一条虚拟机指令直接指出了操作数的数据类型 ( 如 iadd 表示两个整型操作数相加 ) ( 5) Java 虚拟机采用面向堆栈的体系结构 , 仅使用程序计数器 ( PC) 、 栈顶指针 ( opt op) 、 运行环境指针( fram e) 、 局部变量指针( v ars) 等几个寄存器 . 这样, Jav a 虚拟机即使是在没有 通用寄存器或寄存器很少的机器上也能实现 .
ACC- SYNCHRONIZED= 其它非 0X0020 的值; / / 系统自动解锁隐式
系统自动隐式上锁和解锁部分 , 对用户来说是不可见的, 我们注意到 synchronized 语句 被编译成虚拟机 指令 monitorenter 和 monit orex it , 即使 是在 Java 虚 拟机这 一级, synchro nized 方法的上锁解锁过程对用户也是隐蔽的 . 在 monitor 机制下 , 若一个线程已得到了 monit or, 则其它线程要反复进行上锁测试 ( 如 例 1) , 这可能造成其它线程无休止的 盲等! . 对此需要扩充 monitor 的设计 , 使用显示的等 待( w ait ) 和唤醒( signal) 原语来解决此问题. Java 语言提供了三个标准 Objict 类方法: w ait ( ) , not ify( ) 和 not if yall( ) 来实现线程之间的控制转移. 避免反复检测锁的状态. Java 线程的 状态转换图如图 3 所示, 一个 Jav a 对象除了连着一把锁外, 还有一个 w ait 集 . 一个 w ait ( ) 方 法调用将挂起( suspend) 当前 运行的线程, 并将其放入相 应 synchronized 对象的 w ait 集中 去, 使其由运行态转入不可运行态, 直至有其它线程使用了 not if y( ) 方法或 notify all( ) 方法 来唤醒它. not if y( ) 方法相当于 signal, 调用 not ify( ) 方法将从相应 synchronized 对象的 w ait 集中唤醒一个线程, 使其变为可运行态. ( 该线程仍需等到当前线程退出了 monitor 之后才 能给共享对象上锁, 变为运行态 ) . 此外, wait ( ) 方法也可令当前线程暂时让出 monit or 一段 时间 , 由此可用来解决死锁问题.
第6期
沈勤祖等 : Java 虚拟机多 线程之研究
533
相当于管程 . Java 使用锁机制来解释 monitor 的行为 : Java 采用的同步层次为中粒度同步, 即对每个对象都使用一把锁, 锁的状态有两种 : 上锁( lock) 和解锁( unlock) . Java 语言使用修 饰符 synchronize 来表示需共 享临界资 源 ( 变量或 对象 ) 的方 法 ( 相当于 cobegin, coend 标 记) . 在 synchronize 方法执行之前, 必须对该方法所属的对象的锁进行上锁操作 ( 请求获得 该 monitor) . 如果得不到这把锁 ( 已被其它线程占用 ) , 则调用该 synchronize 方法的线程要 延迟直至对这把锁上了锁 ( 进入 monit or ) . 在用有 monitor 的线程执行期间, 其它线程不能 获得该 monitor, 在该线程调用的 synchronize 方法执行结束 ( 无论是正常还是异常结束) 之 后, 该线程自动释放 monit or. 上述对一个对象锁的上锁和解锁操作不是由线程 , 而是由 syn chronize 方法通过检测和设置常数池中的 ACC- SYNCHRONIZE 标志隐式自动地完成的. 其执行过程可用一个例子描述如下 : 例 1 synchronized 方法的执行 public sy nchronized vo id ex ample( ) { do{ } w hile ( ACC- SYNCHRONIZED= 0X0020) ; ACC- SYNCHRON IZED= 0X0020; 方法体 / / 方法内部语句, 是用户可见的部分 } / / 系统自动隐式完成 / / 的加锁部分
相关文档
最新文档