Java多线程编程之synchronizaed和锁分类

并发编程第三周

1 锁的分类

1.1 可重入锁,不可重入锁

Java提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁

可重入:当前线程获取到A锁,在获取之后尝试再次获取A锁是可以直接拿到的。

不可重入:当前线程获取到A锁,在获取之后尝试再次获取A锁,无法获取到,因为A锁被当前线程占用着,需要等待自己释放锁再获取是锁。

1.2 乐观锁,悲观锁

Java提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是悲观锁

Java中提供的CAS操作,就是乐观锁的一种实现

悲观锁:获取不到锁资源时,会将当前线程挂起(进入BLOCK,WAITING),线程挂起会涉及到用户态和内核态的切换,消耗资源

  • ​ 用户态:jvm可以自行执行的指令,不需要借助操作系统执行
  • ​ 内核态:jvm不可以自行执行的指令,需要借助操作系统执行

**乐观锁:**获取不到锁可以再让CPU调度,重新尝试获取锁资源

Atomic原子类就是基于CAS乐观锁实现的

1.3 公平锁,非公平锁

Java提供的synchronized只能时非公平锁

ReentrantLock,ReentrantReadWriteLock可以实现公平和非公平

**公平锁:**线程A获取到了锁资源,线程B没有拿到,线程B排队,线程C来了,锁被A持有,同时B在排队。直接排到B后面,等待B拿到锁资源或者B取消后,才可以尝试区竞争锁资源。

非公平锁:线程A获取到了锁资源,线程B没有拿到,线程B排队,线程C来了,直接先去尝试竞争一波

  • 拿到锁:插队成功
  • 没有拿到锁:依然排队到B后面,等待B拿到锁资源或者B取消后,才可以尝试区竞争锁资源

1.4 互斥锁,共享锁

Java提供的synchronized,ReentrantLock 互斥锁

ReentrantReadWriteLock有互斥锁也有共享锁

互斥锁:同一时间点,只会有一个线程持有当前互斥锁

共享锁:同一时间点,当前共享锁可以被多个线程同时持有

2 深入synchronized

2.1 类锁,对象锁

synchronized的使用一般就是同步方法块和同步代码块

synchronizated的锁时基于对象实现的

使用同步方法:

  • static:此时使用的时当前类.class作为锁(类锁)
  • 非static:此时使用的时当前对象做为锁(对象锁)

2.2 synchronized的优化

锁消除:在synchronized修饰的代码中,如果不存在操作临界资源的情况,会触发锁消除,即便写了synchronized也不会触发

public synchronized void method(){
// 没有操作临界资源
// 此时这个方法的synchronized你可以认为木有~~
}

锁膨胀:如果在一个循环中,频繁的获取和释放锁资源,这样带来的消耗很大,锁膨胀就是将锁的范围扩大,避免,频繁的获取和释放锁资源带来不必要的消耗。

锁升级:ReentranLock的实现,是先基于乐观锁CAS尝试获取资源,如果拿不到锁资源,才会挂起线程。synchronizated在jdk1.6之前,完全就是获取不到锁,立即挂起当前线程,所以性能差。

synchronizated在jdk1.6之后做了锁升级的优化

  1. 无锁,匿名偏向:当前对象没有作为锁的存在

  2. 偏向锁:如果当前锁资源只有一个线程频繁的获取和释放,那么这个线程过来,只需要判断当前指向的线程是否位当前线程。

    • 如果是,直接拿走锁资源

    • 如果不是,基于CAS的方式尝试将偏向锁指向当前线程。如果获取不到,锁升级,升级位轻量级锁(偏向锁状态出现了锁竞争的情况)

  3. 轻量级锁:会采用自旋锁的方式取频繁的以CAS的形式获取锁资源。(采用的是自适应自旋锁)

    ​ 如果成功获取到,拿着锁资源走

    ​ 如果自旋一定次数,没有拿到锁资源,锁升级

  4. 重量级锁:就是最传统的synchronized方式,拿不到锁资源,就挂起当前线程。

2.3 synchronized实现原理

synchronized是基于对象实现的。

Java对象在堆内存中的存储

在这里插入图片描述

展开MarkWord

在这里插入图片描述

MarkWord中标记着四种锁的信息:无锁、偏向锁、轻量级锁、

偏向锁延迟:偏向锁在升级为轻量级锁时,会涉及到偏向锁撤销,需要等到一个安全点,才可以做偏向锁撤销,在明知道有并发情况下,就可以选择不开启偏向锁,或者设置偏向锁延迟开启。因为在jvm启动时,需要加载的.class文件到内存中这个操作会涉及到synchronized的使用,为了避免出现偏向锁撤销操作,jvm启动初期,会有一个延迟4s开启偏向锁的操作。如果正常开启偏向锁了,那么不会出现无锁状态,对象会直接变为匿名偏向

整个锁升级状态的转变:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

2.5 重量锁底层ObjectMonitor

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

python使用mongo操作

目前有个需求,就是把所有sql转为mongo管道查询 知识点 在 MongoDB 中,allowDiskUse 选项应该作为聚合命令的一个选项,而不是聚合管道的一个阶段。allowDiskUse 选项用于允许聚合操作使用磁盘空间来临时存储数据(当聚合操作的数据…

[leetcode] 67. 二进制求和

文章目录 题目描述解题方法模拟java代码复杂度分析 相似题目 题目描述 给你两个二进制字符串 a 和 b ,以二进制字符串的形式返回它们的和。 示例 1: 输入:a "11", b "1" 输出:"100"示例 2: 输…

串的模式匹配之KMP算法实现

概述 函数刻画 主串位置不变,next值就是模式串(子串)比较后应跳转的位置 不同位置 next[j]函数 next由模式串决定,看模式串当前比较位的前串中前后缀相同的个数来得k-1的值,next[当前位]k1 小补充 PM值:也称部分匹配值&#xf…

产品推荐 | 基于Intel (Altera) Cyclone V打造的水星Mercury SA1核心板

01 产品概述 水星Mercury SA1片上系统(SoC)核心板通过结合基于ARM处理器的SoC FPGA、快速DDR3L SDRAM、eMMC flash、QSPI flash、Gigabit Ethernet PHY和RTC形成了一个高性能嵌入式处理方案,结合了CPU系统的灵活性和FPGA原始的、实时的并行处…

EXCEL——VLOOKUP函数

一、VLOOKUP函数的语法 VLOOKUP(lookup_value,table_array,col_index_num,[range_lookup]) lookup_value 需要在数据表首列进行搜索的值,可以是数值,引用或字符串 table_array 要在其中搜索数据的文字、数字或逻辑值表,可以是对区域或…

自动化测试再升级,大模型与软件测试相结合

近年来,软件行业一直在迅速发展,为了保证软件质量和提高效率,软件测试领域也在不断演进。如今,大模型技术的崛起为软件测试带来了前所未有的智能化浪潮。 软件测试一直是确保软件质量的关键环节,但传统的手动测试方法存…

阿里巴巴中国站关键字搜索API返回值全攻略:精准定位所需商品

当使用阿里巴巴中国站的关键字搜索API时,理解其返回值的结构和内容对于精准定位所需商品至关重要。以下是一份全面的攻略,帮助你更好地利用这个API: 在商品列表中,每个商品对象都包含丰富的信息,以帮助你精准定位所需商…

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…

PDF文档如何签名?用Adobe信任的文档签名证书

为PDF文档电子签名的方式有多种多样,但并非所有方案都是可靠的。我们在市面看到的电子图章、电子印章等仅在文档中置入印章图片的方式,并不具有任何法律上的有效性,它只是显示印章的图形效果,随时可以被篡改、伪造。PDF文档如何签…

煤矿设备故障ar远程诊断系统缩短时间

深圳华锐视点,一家专注于AR增强现实技术服务的创新型企业,致力于为电商、金融、快消、文创等众多行业赋予AR超能力。我们坚信,AR技术不仅是现实的延伸,更是未来生活的引领者。 在现实与虚拟交织的AR世界中,我们全面开启…

安泰ATA-309C:功率放大器的分类及区别是什么

功率放大器是一种电子器件,用于将低功率信号放大到更高功率,以驱动负载或增强信号强度。功率放大器根据其工作原理、电路拓扑和应用领域的不同,可以分为多种类型。下面将介绍几种常见的功率放大器分类及其区别。 A类功率放大器:A类…

实战Java虚拟机-基础篇

一、基础篇-Java内存区域 1.运行时数据区 运行时数据区-总览 Java虚拟机在运行Java程序过程中管理的内存区域,称之为运行时数据区。 《Java虚拟机规范》中规定了每一部分的作用。 1.程序计数器 程序计数器(Program Counter Register)也叫…

鸿蒙——即将是国内全部物联网的搭载系统

国内物联网时代 中国国内物联网时代是指在中国国内,物联网(Internet of Things,简称IoT)技术得到广泛应用和发展的时代。在这个时代,各种设备和物品都可以通过互联网进行连接和交互,实现信息的采集、传输和…

教程分享:如何为跨境电商、外贸、国际展会制作二维码?

不论是做跨境电商、在全球做产品推广,还是国外的餐厅运营、参加国际展会,或者是做创意户外广告、制作个性化的个人名片、有趣的产品包装……只要是在国外使用二维码,你都可以在QR Tiger去制作您需要的二维码! 一、认识QR Tiger 二…

读源码系列文章--开源项目openjob之alarm告警模块

一、背景 告警模块,作为大多数应用都存在的一个基础功能,今天我们就以开源项目openjob 为例,分析其设计及实现。 首先,我们梳理一下需求: 支持多种告警方式,包括钉钉、飞书、微信和webhook。方便业务模块…

C++实现二叉搜索树(模型)

目录 1.二叉搜索树的概念 2.二叉搜索树的实现 2.1总体代码预览 2.2各个函数实现原理 链表结构体 二叉搜索树的成员变量 二叉搜索树的插入 二叉搜索树的查找 二叉搜索树的遍历 二叉搜索树的删除 1.二叉搜索树的概念 二叉搜索树又称二叉排序树,它或者是一棵空树&#…

CSS中文本样式(详解网页文本样式)

目录 一、Text介绍 1.概念 2.特点 3.用法 4.应用 二、Text语法 1.文本格式 2.文本颜色 3.文本的对齐方式 4.文本修饰 5.文本转换 6.文本缩进 7.color:设置文本颜色。 8.font-family:设置字体系列。 9.font-size:设置字体大小。…

做好源代码防泄密的10条准则

#深度好文计划# 近年来,电脑以及互联网应用在中国的普及和发展,已经深入到社会每个角落, 政府,经济,军事,社会,文化和人们生活等各方面都越来越依赖于电脑和网络。企业需要花费大量的时间精力去…

PC小程序解密及反编译

一、小程序包解密 小程序原始加密包位置C:\Users\administrator\Documents\WeChat Files\Applet\wx234324324324 二、wxappUnpacker反编译 npm install./bingo D:\temp\小程序包解密\wxpack\wx234324324324.wxapkg 三、查看反编译后的文件

Fluence Developer Rewards 国内 每个账号收2000元

# 国内有金主支持 每个账号收2000元 Fluence Developer Rewards account_line 白名单见附件 # 感兴趣的请留言 或加微信 Fluence Developer Rewards This repo allows one to generate a proof signature for Fluence dev reward claiming. 感兴趣 Caution Beware of s…