博客
关于我
Java锁和监视器
阅读量:329 次
发布时间:2019-03-04

本文共 922 字,大约阅读时间需要 3 分钟。

    首先要明确的一点是监视器模型不是Java特有的,他是操作系统层次的概念,是为了实现线程同步而采取的技术手段,任何编程语言的并发设计中都可以出现这个概念。

    在Java中,每个对象和Class内部都有一个锁,Class广义上也是一个单例对象,每个对象和Class会和一个监视器关联,注意措辞,锁是存在于对象内部的数据结构,监视器是一个独立的结构但是和对象关联,相同点是对象一定有一个锁也一定关联一个监视器。另外,监视器是操控线程的,他会维持一个代码数据区和线程队列等,保证同一时刻只有一个线程访问代码数据区,监视器就是通过判断对象里锁来完成这个安全访问的功能的。监视器是比锁更高层次的抽象。具体的操作流程是:当代码进入同步区域时,找到对象关联的监视器,然后调用监视器获取锁的方法,监视器会读取对象头里面有关锁的信息作为参数,然后进行获取锁的操作,或是让当前线程得到锁,或是让当前线程等待,当代码退出同步区域时,找到对象关联的监视器,然后调用监视器释放锁的操作,整个流程大致是这个样子。另外,需要明白的是,所有代码都隶属于某个对象,非静态方法好说,静态方法是和Class对象关联的,广义上也是隶属于某个对象的。这样就能理解为什么多线程为什么能够实现同步了,因为多个线程执行同一个监视器管理的一份临界资源,自然就能处理同步的细节了。    这一点可以从Object的wait()/notify()/notifyAll()的方法可以佐证,这几个方法是线程间协作用的,而只有监视器拥有调控线程协作的能力,这就说明了每一个对象是关联了一个监视器,这几个方法可以说是监视器方法了。

    另外,Java提供了synchronized关键字和ReentrantLock类来提供线程同步功能。synchronized的使用场景就三种:       
1、修饰非静态方法,锁基于当前实例;
2、修饰静态方法,锁基于当前类Class;                                                                                                                                 
3、修饰语句块,锁基于括号里配置的实例;                                                                                                                           
需要强调的是,修饰语句块和方法的实现细节是不一样的,代码块同步使用monitorenter和monitorexit指令实现,方法同步是另外一种方式,JVM规范没有详细说明,但是方法的同步是可以通过这两个指令来实现的。

转载地址:http://hjzh.baihongyu.com/

你可能感兴趣的文章
mysql复制内容到一张新表
查看>>
mysql复制表结构和数据
查看>>
mysql复杂查询,优质题目
查看>>
MySQL外键约束
查看>>
MySQL多表关联on和where速度对比实测谁更快
查看>>
MySQL多表左右连接查询
查看>>
mysql大批量删除(修改)The total number of locks exceeds the lock table size 错误的解决办法
查看>>
mysql如何做到存在就更新不存就插入_MySQL 索引及优化实战(二)
查看>>
mysql如何删除数据表,被关联的数据表如何删除呢
查看>>
MySQL如何实现ACID ?
查看>>
mysql如何记录数据库响应时间
查看>>
MySQL子查询
查看>>
Mysql字段、索引操作
查看>>
mysql字段的细节(查询自定义的字段[意义-行列转置];UNION ALL;case-when)
查看>>
mysql字段类型不一致导致的索引失效
查看>>
mysql字段类型介绍
查看>>
mysql字段解析逗号分割_MySQL逗号分割字段的行列转换技巧
查看>>
MySQL字符集与排序规则
查看>>
MySQL字符集乱码
查看>>
mysql存储IP地址的数据类型
查看>>