博客
关于我
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/

你可能感兴趣的文章
nacos运行报错问题之一
查看>>
Nacos部署中的一些常见问题汇总
查看>>
NACOS部署,微服务框架之NACOS-单机、集群方式部署
查看>>
Nacos配置Mysql数据库
查看>>
Nacos配置中心中配置文件的创建、微服务读取nacos配置中心
查看>>
Nacos配置中心集群原理及源码分析
查看>>
nacos配置在代码中如何引用
查看>>
nacos配置新增不成功
查看>>
nacos配置自动刷新源码解析
查看>>
nacos集成分布式事务插件Seata的序列化问题,实际上是Seata本身存在bug!!
查看>>
Nacos集群搭建
查看>>
nacos集群搭建
查看>>
nacos集群网络分区对的影响和运维方式
查看>>
nacos集群节点故障对应用的影响以及应急方法
查看>>
nacos集群配置详解
查看>>
nagios 实时监控 iptables 状态
查看>>
nagios+cacti整合
查看>>
Nagios介绍
查看>>
nagios利用NSCient监控远程window主机
查看>>
nagios安装文档
查看>>