cathy97问:
在JVM的规范中,有这么一些话:
“在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的”
“为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁”
“锁住了一个对象,就是获得对象相关联的监视器”
从这些话,看出监视器和对象锁好像是一回事,那为何要定义两个东西,若不一样,他们的关系如何?
interhanchi的解释:
我觉得讲的很清楚呀.
监视器好比一做建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,进入这个建筑叫做"进入监视器",进入建筑中的那个特别的房间叫做"获得监视器",占据房间叫做"持有监视器",离开房间叫做"释放监视器",离开建筑叫做"退出监视器".
而一个锁就像一种任何时候只允许一个线程拥有的特权.
一个线程可以允许多次对同一对象上锁.对于每一个对象来说,java虚拟机维护一个计数器,记录对象被加了多少次锁,没被锁的对象的计数器是0,线程每加锁一次,计数器就加1,每释放一次,计数器就减1.当计数器跳到0的时候,锁就被完全释放了.
java虚拟机中的一个线程在它到达监视区域开始处的时候请求一个锁.JAVA程序中每一个监视区域都和一个对象引用相关联.
去看一下深入java虚拟机吧,里面这个讲的很清楚!
taolei的解释:
活活,这中文翻译的也真够直接的。
监视器:monitor
锁:lock(JVM里只有一种独占方式的lock)
进入监视器:entermonitor
离开/释放监视器:leavemonitor
(entermonitor和leavemonitor是JVM的指令)
拥有者:owner
在JVM里,monitor就是实现lock的方式。
entermonitor就是获得某个对象的lock(owner是当前线程)
leavemonitor就是释放某个对象的lock
分享到:
相关推荐
Java并发锁和监视器的区别 Java并发编程中,锁(lock)和监视器(monitor)是两个重要的概念,它们都是用于实现线程安全的机制。本文将详细讨论锁和监视器之间的区别,并阐述它们在Java并发编程中的应用。 锁...
总结起来,Java中的监视器机制是通过锁和特定的协作方法来实现线程同步的,它确保了多线程环境下的数据安全和程序的正确性。理解和熟练掌握监视器的原理与使用,对于编写高效、可靠的并发代码至关重要。在实际开发中...
对象监视器设置了多种状态来区分请求的线程,如 Contention List、Entry List、Wait Set、OnDeck 和 Owner 等。 Contention List 是一个虚拟队列,用于存储所有请求锁的线程。Entry List 是一个等待队列,用于存储...
线程在对象头的Mark Word部分存储锁记录指针,指向分配给该线程的锁记录或栈帧中的对象监视器。如果此时有其他线程竞争,锁会膨胀为重量级锁,Mark Word中存储的是指向重量级锁(互斥量)的指针。 在JDK 1.8版本中...
Monitor,也就是监视器,是基于Java虚拟机(JVM)实现的一种锁机制,它确保同一时刻只有一个线程能够执行特定的同步代码。 在JDK1.6之前,`synchronized`被视为重量级锁,因为它涉及到操作系统层面的互斥量(Mutex...
在Windows操作系统中,性能监视器(Performance Monitor)是一款强大的工具,用于监测系统资源的使用情况,特别是对于数据库服务器如SQL Server来说,它可以帮助管理员识别和解决问题。本文将深入探讨如何利用性能...
Java中的锁主要分为两大类:内置锁(也称为监视器锁)和显式锁。内置锁通过`synchronized`关键字来实现,而显式锁则通过`ReentrantLock`等类来实现。 ##### 1. 内置锁(Synchronized) `synchronized`关键字是Java...
- 当`synchronized`修饰代码块时,监视器锁是`synchronized`括号里配置的对象。 ##### 4.2 wait(), notify() 和 notifyAll() 这些方法都是由Object类提供的,主要用于实现线程间的通信: - `wait()`:使持有监视...
3. **监视器锁**:`synchronized`关键字实际上基于Java的监视器锁(Monitor)机制,由JVM实现。当线程进入`synchronized`代码块或方法时,会获取锁并进入临界区,执行完毕后释放锁,其他线程才能继续执行。 **...
首先,Java中的锁主要包括两种类型:内置锁(也称为监视器锁)和显式锁。内置锁是通过`synchronized`关键字实现的,它隐含地在每个对象上都存在。当一个线程进入一个由`synchronized`修饰的方法或代码块时,会自动...
3. **线程等待和锁的释放**:如果一个线程试图进入已由其他线程持有的监视器,它将被阻塞并在等待池中排队。只有当监视器的当前持有者完成执行并释放锁时,这些线程才有可能继续执行。 4. **return语句**:在同步...
其中,`object`是监视器对象,每个线程在进入同步块之前必须先获得监视器对象的锁。在售票示例中,我们可以用`this`作为监视器对象,因为它代表当前类的实例: ```java public void run() { for (int i = 0; i ...
重点解析了synchronized的工作原理,包括其底层原理、Monitor监视器锁的工作方式,以及Java对象的内存布局。文中详细介绍了synchronized在JVM中的实现,侧重于其内部对象Monitor(监视器锁)的实现原理。讨论了监视...
钥匙在这里就是对象的监视器锁,每个对象都有一个与之关联的锁。 当线程尝试进入一个`synchronized`方法时,它首先检查是否已经有人持有该锁。如果没有,它就获取锁并执行方法;如果有,它就会被阻塞,直到锁被...
在这里,`object`是监视器锁的对象,只有获取到这个对象的锁的线程才能进入代码块。 3. **synchronized 关键字**: `synchronized`关键字是Java中的内置锁机制,它基于Java内存模型(JMM)来确保线程间的可见性和...
摘要:C#源码,系统相关,多线程,监视器 一个适合初学者参考学习的C#多线程监视器程序,创建3个线程,模拟多线程运行,并绑定TestRun方法,定义线程的绑定方法,在同步对象上获取排他锁,模拟做一些耗时的工作。
在Java中,锁主要分为两类:内置锁(也称为监视器锁)和显式锁。内置锁是通过synchronized关键字实现的,它可以保证线程的互斥和可见性。当一个线程进入某个对象的同步代码块或同步方法时,会自动获取该对象的锁,...
任何对象都可以作为同步监视器对象,每个同步监视器对象都有且仅有一个锁,线程一旦获取了该同步监视器对象的锁,其他访问该同步监视器对象的线程就要等待。 例如,使用Java程序模拟航班售票系统,在多个窗口同时...