锁 synchronized和lock

Synchronized 原理:

方法级的同步是隐式, 即无需通过字节码指令来控制的, 它实现在方法调用和返回操 作之中。JVM 可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法 。当方法调用时, 调用指 令将会 检查方法的 ACC_SYNCHRONIZED 访问标志是否被设置, 如果设置了, 执行线 程将先持有 monitor (虚拟机规范中用的是管程一词), 然后再执行方法, 最后再方 法完成(无论是正常完成还是非正常完成)时释放 monitor 。

代码块的同步是利用 monitorenter 和 monitorexit 这两个字节码指令 。它们分别位于 同步代码块的开始和结束位置 。当 jvm 执行到 monitorenter 指令时, 当前线程试图 获取 monitor 对象的所有权, 如果未加锁或者已经被当前线程所持有, 就把锁的计数 器+1; 当执行 monitorexit 指令时, 锁计数器-1; 当锁计数器为 0 时, 该锁就被释放 了 。如果获取 monitor 对象失败, 该线程则会进入阻塞状态, 直到其他线程释放锁。

Lock原理:

  1. Lock 的存储结构: 一个 int 类型状态值 (用于锁的状态变更), 一个双向链表 (用于存储等待中的线程)

  2. Lock 获取锁的过程: 本质上是通过 CAS 来获取状态值修改, 如果当场没获取 到, 会将该线程放在线程等待链表中 。

  3. Lock 释放锁的过程: 修改状态值, 调整等待链表 。

4.Lock 大量使用 CAS+自旋 。因此根据 CAS 特性, lock 建议使用在低锁冲突的 情况下 。

Lock 与 synchronized 的区别:

1.Lock 的加锁和解锁都是由 java 代码配合 native 方法 (调用操作系统的相关方 法) 实现的, 而 synchronize 的加锁和解锁的过程是由 JVM 管理的

2.当一个线程使用 synchronize 获取锁时, 若锁被其他线程占用着, 那么当前只 能被阻塞, 直到成功获取锁 。而 Lock 则提供超时锁和可中断等更加灵活的方式, 在未 能获取锁的 条件下提供一种退出的机制 。

3.一个锁内部可以有多个 Condition 实例, 即有多路条件队列, 而 synchronize 只有一路条件队列; 同样 Condition 也提供灵活的阻塞方式, 在未获得通知之前可以 通过中断线程以 及设置等待时限等方式退出条件队列 。

4.synchronize 对线程的同步仅提供独占模式, 而 Lock 即可以提供独占模式, 也 可以提供共享模式

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3277.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uiautomation 监控 Discord客户端的聊天记录 附python代码

一个Python脚本,用于监控和抓取Discord客户端的聊天记录。它使用了`uiautomation`库来模拟用户界面操作, 定义了一个名为`discord`的类,它初始化了几个变量,包括一个用于控制UI自动化的`UiaAPI`对象,以及一个用于存储会话项目的列表`SessionItemList`。 通过UI自动化获取名…

深度学习与目标检测:从卷积神经网络到YOLOv8概念介绍

深度学习与目标检测:从卷积神经网络到YOLOv8的深入探索 随着人工智能技术的迅猛发展,深度学习和计算机视觉领域取得了举世瞩目的成果。在目标检测这一关键任务中,卷积神经网络(CNN)和YOLO系列模型发挥着至关重要的作用…

Redis中的Lua脚本(六)

Lua脚本 清空repl_scriptcache_dict字典 每当主服务器添加一个新的从服务器时,主服务器都会清空自己的repl_scriptcache_dict字典,这是因为随着新从服务器的出现,repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过&#xf…

使用 pytorch训练自己的图片分类模型

如何自己训练一个图片分类模型,如果一切从头开始,对于一般公司或个人基本是难以实现的。其实,我们可以利用一个现有的图片分类模型,加上新的分类,这种方式叫做迁移学习,就是把现有的模式知识,转…

leetcode77--组合

1. 题意 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 2. 题解 1. 回溯减枝 class Solution { public:vector<int> temp;vector<vector<int>> ans;void dfs(int cur, int n, int k) {// 剪…

流量分析利器arkime的学习之路(二)---API接口

前文回忆 《流量分析利器arkime的学习之路(一)---安装部署》 概述 注意点 Arkime对所有API调用都使用摘要身份验证,因此请确保在库或curl命令中启用摘要身份验证。学习如何进行API调用的最简单方法是打开浏览器的javascript控制台,观察Arkime UI正在进行的调用,它使用…

向表内INSERT数据出现ORA-00600 ktspgfb-inc2错误的分析处理

业务高峰期&#xff0c;业务维护人员反馈某业务卡主&#xff0c;发来报错一看&#xff0c;是ORA-00600...的&#xff0c;心理一下就紧张起来&#xff1b;当前版本的ORA-00600错误&#xff0c;基本分为了2类&#xff0c;要么没啥影响&#xff1b;如果对业务有影响了&#xff0c;…

强化学习的重要概念:环境、模型、策略和它们的关系

在强化学习中&#xff0c;环境&#xff08;Environment&#xff09;、模型&#xff08;Model&#xff09;和策略&#xff08;Policy&#xff09;是三个核心概念&#xff0c;它们之间的关系可以描述如下&#xff1a; 环境&#xff08;Environment&#xff09;&#xff1a; 环境是…

<component> <slot> <template>三者之间的区别与使用

学习目标&#xff1a; 目标 1、了解组件的含义 2、了解 的含义及用法 3、了解 的含义及用法 4、了解 的含义及用法 学习内容&#xff1a; 内容&#xff1a; 什么是组件&#xff1f; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量&#xff0c;能够让我们以不同的组件&am…

deque的插入和删除

函数原型 两端插入操作 push_back(elem) //向容器尾部添加一个数据push_front(elem) //向容器头部插入一个数据pop_back() //删除容器最后一个数据 pop_front() //删除第一个容器第一个数据 …

点云数据处理的库

PCL、Open3D和OpenGL都是用于点云数据处理的常用库&#xff0c;它们各有优劣&#xff0c;具体如下&#xff1a; PCL&#xff08;Point Cloud Library&#xff09; PCL是一个非常流行的开源点云数据处理库&#xff0c;它支持从各种传感器&#xff08;如激光雷达、Kinect&#xf…

Python实战 | 只需“4步”入门网络爬虫(小白也会)

文章目录 Python实战 | 只需“4步”入门网络爬虫&#xff08;小白也会&#xff09;1&#xff1a;确定目标网站和数据2&#xff1a;安装必要的库3&#xff1a;编写爬虫代码4.目标网站的URL5.发送HTTP请求并获取响应内容6.使用BeautifulSoup解析HTML内容7.查找包含新闻标题和链接…

【golang学习之旅】Go 的基本数据类型

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 目录 系列文章总览布尔型&#xff08;bool&#xff09;字符串型&#xff08;string&#xff09;整数型&#xff08;int、uint、byte、rune&#xff09;浮点型&#xff08;float32、float64&#xff09;复…

【C++】——类与对象引入和认识

创作不易&#xff0c;多多支持&#xff01; 前言 有了上一篇博客的基础以后&#xff0c;就正式进入C类和对象的领域了&#xff0c;如果看完本篇文章对你有用&#xff0c;还请多多支持&#xff01;&#xff01;&#x1f618;&#x1f618; 一 面向过程和面向对象 1.面向过程 …

js的includes函数

在JavaScript中&#xff0c;includes() 是一个数组&#xff08;Array&#xff09;和字符串&#xff08;String&#xff09;对象的方法&#xff0c;用于确定一个数组是否包含一个特定的值&#xff0c;或者一个字符串是否包含一个特定的子串。如果找到该值或子串&#xff0c;则返…

MySql on duplicate key update

"ON DUPLICATE KEY UPDATE"是MySQL的语法&#xff0c;当尝试插入的行导致一个duplicate key错误&#xff08;如果该行中存在一个unique索引或primary key&#xff0c;并且该索引或primary key在表中已经存在&#xff09;&#xff0c;则执行UPDATE。 使用基本的SQL语…

单链表实现通讯录

不过多赘述了 顺序表的增删查改-CSDN博客https://blog.csdn.net/bkmoo/article/details/137566495?spm1001.2014.3001.5502 使用顺序表实现通讯录-CSDN博客https://blog.csdn.net/bkmoo/article/details/137676561?spm1001.2014.3001.5502这里没有使用文件操作只是简单的使…

全程免费的ssl证书申请——七步实现网站https

全程免费的ssl证书申请步骤如下&#xff1a; 1 准备工作 首先确定好需要的证书类型&#xff0c;如单域名证书、通配符证书和多域名证书&#xff0c;准备好需要安装证书的域名。 2 选择CA 选择提供免费证书的服务商——JoySSL&#xff0c;并访问其官方网站&#xff0c;创建一…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…

代码随想录训练营Day 32|Python|Leetcode|● 738.单调递增的数字

738.单调递增的数字 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c;且数字呈 单调递增 。 解题思路&#xff1a; 对于所给数字进行str()并从后向前…