Java中监视器和锁

监视器和锁在Java虚拟机中是一块使用的。监视器监视一块同步代码块,确保一次只有一个线程执行同步代码块。每一个监视器都和一个对象引用相关联。线程在获取锁之前不允许执行同步代码。

在JVM的规范中,有这么一些话:
“在JVM中,每个对象和类在逻辑上都是和一个监视器相关联的”
“为了实现监视器的排他性监视能力,JVM为每一个对象和类都关联一个锁”
“锁住了一个对象,就是获得对象相关联的监视器”
从这些话,看出监视器和对象锁好像是一回事,那为何要定义两个东西,若不一样,他们的关系如何?

解释1:
监视器好比一座建筑,它有一个很特别的房间,房间里有一些数据,而且在同一时间只能被一个线程占据,进入这个建筑叫做"进入监视器",进入建筑中的那个特别的房间叫做"获得监视器",占据房间叫做"持有监视器",离开房间叫做"释放监视器",离开建筑叫做"退出监视器"。

而一个锁就像一种任何时候只允许一个线程拥有的特权

一个线程可以允许多次对同一对象上锁。对于每一个对象来说,Java虚拟机维护一个计数器,记录对象被加了多少次锁,没被锁的对象的计数器是0,线程每加锁一次,计数器就加1,每释放一次,计数器就减1。当计数器跳到0的时候,锁就被完全释放了。

Java虚拟机中的一个线程在它到达监视区域开始处的时候请求一个锁,Java程序中每一个监视区域都和一个对象引用相关联。

解释2:
监视器:monitor
:lock(JVM里只有一种独占方式的lock)
进入监视器:entermonitor
离开/释放监视器:leavemonitor
(entermonitor和leavemonitor是JVM的指令)
拥有者:owner

在JVM里,monitor就是实现lock的方式。
entermonitor就是获得某个对象的lock(owner是当前线程)
leavemonitor就是释放某个对象的lock

对象的“锁”一般我们也将其称为监视器(monitor)

而Java中的锁是指Lock接口

Lock接口提供了与Synchronized关键字类似的同步功能,但是还有其他优势:

非阻塞地获取锁(tryLock()):若能立即获得锁,则返回true,否则返回false;
能被中断的获取锁
超时获取锁

重入锁(ReentrantLock)
线程再次获取锁:锁需要去识别获取锁的线程是否为当前当前占据锁的线程,如果是,则再次获取锁。(Synchronized也支持隐式的重进入)
锁的最终释放:线程重复n次获取了锁,随后在第n次释放该锁后,其他线程才能获取到锁,。获取锁,计数自加,释放锁计数自减,等于0时表示释放锁成功

公平锁:ReentrantLock提供了一盒构造函数,能够控制锁是否公平。

Lock fairLock=new ReentrantLock(true);
Lock unfaireLock=new ReentrantLock(false);

公平锁按FIFO原则,而代价是进行大量的线程切换

非公平锁虽然可能造成线程“饥饿”,但极少的线程切换,保证了其更大的吞吐量,所以一般默认设定是非公平锁。

读写锁

ReentrantReadWriteLock rwl=new ReentrantReadWriteLock();
Lock r=rwl.readLock();
Lock w=rwl.writeLock();

LockSupport工具:定义一组公共静态方法阻塞(park())或唤醒(unpack())线程,还有parkNanos(long nanos),parkUntil(long deadline);

参考文章:
https://blog.csdn.net/kai_wei_zhang/article/details/8196364
https://blog.csdn.net/qq_33605294/article/details/89297904

Java中监视器和锁相关推荐

  1. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等...

    http://blog.51cto.com/13919357/2339446 Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容 ...

  2. Java 中15种锁的介绍:公平锁,可重入锁,独享锁,互斥锁,乐观锁,分段锁,自旋锁等等

    Java 中15种锁的介绍 在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁 / 非公平锁 可重入锁 / 不可重入锁 独享锁 / 共享锁 互 ...

  3. 浅谈Java中的各种锁

    在读很多并发文章中,会提及各种各样锁如公平锁,乐观锁等等,这篇文章介绍各种锁的分类.介绍的内容如下: 公平锁/非公平锁 可重入锁 独享锁/共享锁 互斥锁/读写锁 乐观锁/悲观锁 分段锁 偏向锁/轻量级 ...

  4. Java基础-Java中常用的锁机制与使用

    Java基础-Java中常用的锁机制与使用 锁lock或互斥mutex是一种同步机制,主要用于在存在多线程的环境中强制对资源进行访问限制.锁的主要作用为强制实施互斥排他以及并发控制策略.锁一般需要硬件 ...

  5. Java 中的各种锁及其原理

    文章目录 概览 Synchronized锁 Synchronized 锁的底层类别 不同锁下对象头中的内容 偏向锁 轻量级锁 轻量级锁加锁过程 字节码层面 synchronized关键字最主要的三种使 ...

  6. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  7. java lock unlock_详解Java中的ReentrantLock锁

    ReentrantLock锁 ReentrantLock是Java中常用的锁,属于乐观锁类型,多线程并发情况下.能保证共享数据安全性,线程间有序性 ReentrantLock通过原子操作和阻塞实现锁原 ...

  8. Java中的各种锁事

    本文来聊下Java中的各种锁 文章目录 锁概述 各种锁描述 本文小结 锁概述 本文来聊下Java中的各种锁,彻底理解Java中的各种锁. Java中的各种锁 序号 锁名称 应用 1 乐观锁 CAS 2 ...

  9. java 自旋锁_搞懂Java中的自旋锁

    轻松搞懂Java中的自旋锁 前言 在之前的文章<一文彻底搞懂面试中常问的各种"锁">中介绍了Java中的各种"锁",可能对于不是很了解这些概念的同学 ...

最新文章

  1. 解析激光雷达中时序融合的研究现状和发展方向
  2. es6 日期字符串转日期_量化数据预处理-中文日期(含)转英文日期
  3. 014_SpringBoot视图层技术thymeleaf-访问域对象
  4. 01 React初步认知、React元素、渲染、工程化
  5. 二面蚂蚁金服(交叉面),已拿offer,Java岗定级阿里P6
  6. MATLAB判断文件是否存在、删除文件
  7. java开源图像处理ku_83 项开源视觉 SLAM 方案够你用了吗?
  8. 在Cygwin上安装编辑器vim 【ZT】
  9. 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
  10. 伟大的程序员是怎样炼成的?
  11. Enterprise Architect 中文快速入门
  12. C# 怎么生成DLL文件(转)
  13. 汇编篇 :关于地址总线与数据总线的换算
  14. 阿里云ACE-第一天笔记
  15. 国内云市场,腾讯云、阿里云、华为云,谁能更胜一筹呢?
  16. 程序员必备十款开发工具,会用的可以召唤神龙了!
  17. Word文档段落的前后间距单位磅改为行,行改为磅方法演示
  18. 建造者(Builder)模式
  19. Lambda相关图形
  20. C++中的friend class 用法总结

热门文章

  1. Unity立方体六个面不同贴图
  2. 猫猫TOM和小老鼠JERRY最近又较量上了,但是毕竟都是成年人,他们已经不喜欢再玩那种你 追我赶的游戏,现在他们喜欢玩统计。最近,TOM老猫查阅到一个人类称之为“逆序对”的东西,这东西是这样定义的:对
  3. smallint mysql_mysql中int、bigint、smallint 和 tinyint的区别与长度的含义
  4. 第六篇、基于Arduino uno,控制180度舵机(SG90)转动——结果导向
  5. Swagger常见注解@API、@ApiOperation、@ApiParam等
  6. 百度高德批量爬取经纬度并计算距离
  7. 【安全知识分享】2021年安全生产月宣讲课件-交通安全(附下载)
  8. Cache组成及工作原理
  9. 如何使用腾讯云轻量应用服务器以及WordPress搭建个人博客(详细图文教程)
  10. 78. 子集 subsets