监视器
java监视器支持两种线程:互斥和协作。
java虚拟机通过对象锁来实现互斥,允许多个线程在同一个共享数据上独 立而不干扰地工作。
协作则通过object类的wait方法和notify方法来实现,允许多个线程为了同一个目标而共同工作。
我们将监视器比作一个建筑物,里面有很多房间,房间里面有一些数据,并且同一个时间只能被一个线程占据。一个线程进入房间到离开为止,独占其中全部的数据。
进入这个数据叫做进入监视器。
进入房间叫做获得监视器。
占据房间叫做持有监视器。
离开房间叫做释放监视器。
离开建筑叫做退出监视器。
互斥原理
对一个监视器来说监视区域是最小的,不可分割的代码块。同一个监视器中,监视区域只会被一个线程执行。
当一个线程到达了一个监视区域的开始处,它就会放置到监视器的入口区。如果没有其他线程等待,它就会进入监视器并且获得监视器,当执行完监视区域的代码后,就会释放并退出监视器。
如果当前监视器正在被另外一个线程持有,那么它就会进入一个等待队列(如果有其他线程也在等待进入监视器)。当持有线程退出之后,只能有等待队列中的一个线程进入并持有该监视器,其他的线程仍旧留会在等待队列中。
协作原理
当一个线程需要一些特别的数据,而由另一个线程负责改变这些数据的状态时,同步显得特别重要。
eg,一个读线程会由一个缓冲区中读取数据,而当前这个缓存区是空的,就需要一个写线程写入数据,当写数据完成写入,读线程才能做读取操作。
java虚拟机使用的这种监视器叫做等待并唤醒监视器。
这种监视器中,一个已经持有该监视器的线程,可以通过调用等待命令,暂停自身的执行。当这个线程执行等待命令后,就会释放该监视器并进入一个等待区,并会一直在那里持续等待状态,直到一段时间后该监视器内的其他线程调用了唤醒命令。当一个线程调用唤醒命令后,它会持续持有监视器,直到它主动释放监视器。当执行了唤醒命令或者执行完监视区域,释放监视器后,等待线程会苏醒,其中的一个会重新获得监视器,判断状态条件,以便决定是否继续继续进入等待状态或者退出或者执行监视区域。
分享到:
- 2009-01-05 21:53
- 浏览 1506
- 评论(0)
- 论坛回复 / 浏览 (0 / 2172)
- 查看更多
相关推荐
线程同步和互斥通过synchronized关键字和wait()、notify()方法实现。 八、Java标准库 Java Standard Library提供了丰富的API,如 Swing(图形用户界面)、Java IO和NIO(输入输出)、网络编程、数据库连接(JDBC)...
理解Java虚拟机(JVM)的工作原理,包括内存区域(如堆、栈、方法区等)和垃圾回收机制,有助于优化程序性能和解决内存泄漏问题。 十二、Java标准库 Java标准库(Java API)包含大量预定义的类和接口,涵盖了各种...
线程并发执行时,可能会涉及到同步和互斥问题,为避免数据竞争,可以使用`synchronized`关键字或`java.util.concurrent`包中的工具。此外,线程间的通信可以通过`wait()`, `notify()`和`notifyAll()`方法,但这些...
12. 同步与互斥:synchronized关键字和wait()、notify()方法用于控制多线程间的协调。 七、反射机制 13. 反射:在运行时检查类、接口、字段和方法的能力,允许动态调用方法和创建对象。 八、泛型 14. 泛型:提供...
22. **线程同步的方法**: - `synchronized` 关键字。 - `ReentrantLock` 类。 - `Lock` 接口。 23. **锁的等级**: - 方法锁:锁定整个方法。 - 对象锁:锁定特定对象。 - 类锁:锁定整个类的所有实例。 24...
第20章 JSP/Servlet技术 644 实例199 JSP与Servlet之间的跳转 644 实例200 简单的JSP多人聊天室 653 实例201 Servlet生成的动态图片 658 实例202 简单的JSP上传文件 661 实例203 用Servlet获取Web服务器信息 ...
学生可能学习如何创建和管理线程,理解同步和互斥的概念,以及使用synchronized关键字和wait()、notify()方法。 4. **IO流**:Java输入输出流(IO流)用于读写文件、网络通信等数据传输。学生会学习字节流和字符流...
掌握同步和互斥机制,如synchronized关键字和Lock接口,能有效防止并发问题。 七、反射与注解 反射机制允许在运行时动态访问和修改类的信息,而注解提供了一种元数据,可用来为编译器和运行时系统提供信息。 八、...
Java是一种强类型、与平台无关的编程语言,其语法...抽象类不能被实例化,抽象方法没有方法体,选项A和B描述正确,但选项C错误,因为抽象类可以包含非抽象方法,第二十二题答案是C:使用final修饰的类不能有抽象方法。
- 第二种情况下,`s1+=1`会自动进行类型转换,将结果赋值回`short`类型,因此不会出错。 #### 17. Math.round(11.5)与Math.round(-11.5)的结果 - `Math.round(11.5)`返回`12`,`Math.round(-11.5)`返回`-11`,因为`...
- **JVM (Java Virtual Machine)**: 是Java虚拟机,负责执行字节码。 - **JRE (Java Runtime Environment)**: 包含了JVM以及运行Java应用程序所需的库和其他资源。 - **JDK (Java Development Kit)**: 包含了JRE,并...
理解并发编程的基本概念,如同步、互斥、线程安全。 12. **接口与内部类**:接口用于定义行为规范,内部类提供更复杂的封装和抽象。理解接口的使用和匿名内部类的概念。 13. **文件与目录操作**:学习如何使用File...
- **JRE** (Java Runtime Environment): 包括了Java虚拟机(JVM)及Java核心类库,是运行Java程序所需的环境。 - **JDK** (Java Development Kit): 包括了JRE,同时添加了编译器、调试器以及其他工具,是开发Java...
- **Classpath**:环境变量`Classpath`用于告知JVM(Java虚拟机)去哪里查找用户自定义的类或包。如果不设置此环境变量,那么JVM会默认去当前目录下寻找所需的`.class`文件。 **2. Unicode问题** - **Unicode**:...
如果第一个表达式为false,则第二个表达式不会被计算。 - **位运算符&:** 用于按位与操作,在布尔运算中也表示逻辑与,但不是短路运算。 **4. JAVA中对象的生命周期是什么样的?** - **创建:** 通过new关键字或反射...
- **平台无关性:** Java编写的程序可以运行在任何支持Java虚拟机(JVM)的平台上。 **1.2 运行原理** Java程序的执行过程主要包括编译、加载、运行三个阶段: - **编译:** 将Java源代码编译成字节码(.class文件)。...
第7章Java的输入和输出237 7.1文件和输入输出流237 7.2InputStream类和OutputStream类的使用238 7.2.1InputStream中的方法238 7.2.2OutputStream中的方法239 7.2.3文件输入流FileInputStream239 7.2.4文件输出...
JAVA程序首先被编译成字节码文件(.class文件),然后由JAVA虚拟机(JVM)解释执行这些字节码。JVM负责在各种平台上加载、验证、解释和执行字节码。这种设计使得JAVA程序可以轻松地跨平台运行,只需要目标平台上有...
而在第二种情况下,编译器会自动处理类型转换问题,因此代码可以正常运行。 7. **字符变量为什么只能存放一个字符**:字符变量(如`char`)在Java中占用2个字节,只能存储单个字符。这是因为字符集(如Unicode)中的...