监视器和对象锁

引用自:http://blog.youkuaiyun.com/fenglibing/archive/2007/01/15/1483930.aspx

监视器好比一做建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,

进入这个建筑叫做"进入监视器",访问资源时

进入建筑中的那个特别的房间叫做"获得监视器",可以访问资源时

占据房间叫做"持有监视器",可以访问资源,并获得资源锁

离开房间叫做"释放监视器",释放锁

离开建筑叫做"退出监视器". 访问结束

如果监视器被持有,还有线程要访问房间,此时线程将在房间外排除等候。

### Monitor 监视器机制原理 Java 中的 `synchronized` 关键字背后依赖的是 Monitor(监视器),这是一种用于控制多个线程对共享资源访问的同步工具。每当一个方法或一段代码被标记为 `synchronized` 时,实际上是在该方法或代码块上施加了一个 Monitor 。 Monitor 是一种抽象的数据结构,在 JVM 层面实现,它包含了三个主要部分: - **等待队列 (Wait Set)**:存储那些试图获取但是未能成功的线程。 - **所有者 (Owner Thread)**:表示当前持有的线程。 - **入口队列 (Entry Set 或 Entry List)**:当有多个线程竞争同一个的时候,这些线程会被放置在这个队列里排队等候。 #### 机制工作流程 当某个线程想要执行带有 `synchronized` 的方法或者进入由其修饰的代码块时,会遵循如下过程[^1]: 1. 如果此时没有任何其他线程占有此对象上的 Monitor ,则允许该线程获得并继续运行; 2. 若已有另一个线程占有了,则新来的请求线程将加入到入口队列中等待; 3. 占用的线程完成操作之后将会释放,并唤醒处于等待状态的一个或多个人工线程去争夺; 一旦某一线程获得了,那么在其持有的期间内,任何其他的线程都无法再得到同一把直至前者主动放弃为止。这也就意味着对于给定的对象而言,任意时刻最多只有一个活跃的线程能够对其内部数据进行修改操作,从而保障了多线程环境下的安全性[^3]。 #### 使用场景 Monitor 主要适用于需要保护临界区的情况,即存在并发冲突风险的地方。具体来说包括但不限于以下几个方面: - 对象级别的独占访问:确保每次只有一条路径可以改变特定实例的状态。 - 类级别静态成员变量的操作:防止不同类加载器创建出来的两个相同名称类型的副本之间发生干扰。 - 数据库连接池管理:避免过多客户端同时建立新的物理链接造成服务器过载等问题。 ```java public class Counter { private int count; public synchronized void increment() { // 此处使用了synchronized关键字, 表示调用了monitor lock this.count++; } public synchronized int getCount(){ return this.count; } } ``` 上述例子展示了如何利用 Java 内置的支持来构建简单的计数器逻辑,这里的方法都声明为了 `synchronized` 方法形式,因此它们都会受到相应对象 monitor 的保护[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值