关于synchronized介绍

synchronized的特性

1. 乐观锁/悲观锁自适应,开始时是乐观锁,如果锁冲突频繁,就转换为悲观锁

2.轻量级/重量级锁自适应 开始是轻量级锁实现,如果锁被持有的时间较长,就转换成重量级锁

3.自旋/挂起等待锁自适应

4.不是读写锁

5.非公平锁

6,可重入锁

synchronized的使用

1)直接修饰普通方法
锁的是对象(单个对象内部加锁):

public class SynchronizedDemo {public synchronized void methond() {}
}

(2)修饰静态方法
锁的是类的所有对象:

public class SynchronizedDemo {public synchronized static void method() {}
}


(3)修饰代码块
明确指定锁哪个对象:
锁当前对象:

public class SynchronizedDemo {public void method() {synchronized (this) {}}
}

锁类对象:

public class SynchronizedDemo {public void method() {synchronized (SynchronizedDemo.class) {}}
}

只有两个线程竞争同一把锁,才会有锁冲突,才会产生阻塞等待。

synchronized的锁机制

1.锁升级

JVM将synchronized锁分为⽆锁、偏向锁、轻量级锁、重量级锁状态。会根据情况,进⾏依次升
级。

1.偏向锁阶段

核心思想:懒汉模式,能不加锁就不加锁,能晚加锁则晚加锁

偏向锁:并非真正加锁了,而是做了非常轻量的标记

一旦其他线程来和我竞争这个锁,就在另一个线程之前,先把锁获取到

从偏向锁升级到轻量级锁(真正加锁,有互斥)

没有竞争,就把加锁省略

非必要不加锁

在遇到竞争的情况下,偏向锁没有提升效率,但是如果在没有竞争的情况下,偏向锁就大幅度提升效率

2.轻量级锁阶段

有竞争但不多   通过自旋锁方式实现

优:另外的线程把锁释放了,就会第一时间拿到锁

劣:比较耗CPU

与此同时,synchronized内部也会统计 当前这着锁对象,有多少个线程在参与竞争,这里当发生参与竞争的线程比较多了,就会进一步升级到重量级锁

对于自旋锁来说,如果同一个锁竞争者很多,大量的线程都在自旋,整体CPU的消耗就很大

 3.重量级锁阶段

此时拿不到锁的线程就不会继续自旋了,而是进行"阻塞等待",就会让出CPU了(不会使CPU占用率太高)

当当前线程释放锁的时候,就由系统随机唤醒一个线程随机唤醒一个线程来获取锁

2.锁消除

也是synchronized 中内置的优化策略

编译器优化中的一种方式,编译器编译代码的时候,如果发现这个代码,不需要加锁,就会自动化把锁干掉

锁消除,针对一眼看上去就完全不涉及线程安全问题的代码,能够把锁消除掉

偏向锁,运行起来才知道有没有锁冲突

 3.锁粗化

会把多个细粒度的锁,合并成一个粗粒度的锁

synchronized{} 大括号里包含的代码越少,就认为锁的粒度越细,包含的代码越多,就认为锁的粒度越粗

通常情况下,是更偏好于让锁的粒度细一点,更有利于多个线程并发执行的.但是有的时候,是希望锁的粒度粗点也挺好

 总结:

1.锁升级:偏向锁-> 轻量级锁->重量级锁

2.锁消除:自动干掉不必要的锁

3.锁粗话:把多个细粒度的锁合并成一个粗粒度的锁,减少锁竞争的开销

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

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

相关文章

2024家用洗地机品牌推荐!洗地机选什么牌子好?建议选择这几款

如今生活节奏加快,工作繁忙的上班族很少有时间做家务。即使抽出时间打扫,也难以保持家庭长久干净整洁。许多人听说了智能化家居神器——洗地机,想要入手一台。但在市场上各种洗地机层出不穷,很多人不知如何选择。下面是我给大家整…

掌握MyBatis:轻松解锁数据库操作的艺术

MyBatis是一款优秀的持久层框架,它封装了JDBC操作的很多繁琐细节,提供了一种相对简便的操作数据库的方法。MyBatis通过XML描述接口绑定的SQL语句,以及通过Java注解的方式,将Java对象与数据库表进行映射,从而简化了数据…

降低85%的gc发生率:ES的GC调优实践!

#大数据/ES #经验 #性能 ES的服务日志出现一些gc overhead现象,经过调优对比,gc发生率显著下降了85%,分享参数如下: ES的G1GC参数(多实例) -XX:UseG1GC -XX:MaxGCPauseMillis200 -XX:InitiatingHeapOccu…

Redis缓存双写一致性之更新策略

文章目录 1. 经典面试题2. 双写一致性3. 更新策略4. canal简介5. Redis与Mysql数据双写一致性工程落地案例 1. 经典面试题 上面的业务逻辑你用java代码如何实现?你只要用缓存,就可能会涉及到redis缓存与数据库双存储双写,你只要是双写&#x…

嵌入式学习day29 指针复习

1.指针: 1.提供一种间接访问数据的方法 2.空间没有名字,只有一个地址编号 2.指针: 1.地址:区分不同内存空间的编号 2.指针:指针就是地址,地址就是指针 3.指针变量:存放指针的变量称为指针变量,简称为指针 3.指针的定义: int *p NULL; …

MyBatis中 #{} 和 ${} 区别

Mybatis的Mapper映射文件中,有两种方式可以引用形参变量进行取值: #{} 和 ${}。本文将简述两种方式的区别和适用场景 取值引用 #{} 方式 #{}: 解析为SQL时,会将形参变量的值取出,并自动给其添加引号。 例如:当实参username&quo…

AI 笔记助手,你的思路整理助手

大家好,今天给大家介绍一款非常实用的 AI 笔记助手——AI Note。这款助手就像是一个贴心的小助手,能帮助我们整理笔记,提高学习和工作效率。 🤖 AI Note 可以智能总结笔记内容,准确标记重点,让我们更快地获…

final关键字有什么作用

final关键字在Java中用于声明变量、方法和类,表示它们的值或行为不能被修改。 被 final 修饰的类不可以被继承 被 final 修饰的方法不可以被重写 被 final 修饰的变量不可变,被 final 修饰的变量必须被显式第指定初始值,还得注意的是&#…

学习助手:借助AI大模型,学习更高效!

在当今的数字时代,人工智能(AI)的崛起已经彻底改变了我们获取信息、处理数据以及学习新知识的方式。AI大模型,特别是如OpenAI开发的GPT-4这类先进的技术,已成为学习和教育领域的一大助力。本文旨在探索如何借助AI大模型…

了解 SYN Flood 攻击

文章目录: 什么是 SYN Flood 攻击?对网络的影响SYN Flood 发生的迹象如何解决? 什么是 SYN Flood 攻击? SYN Flood(SYN 洪水攻击)是一种常见的分布式拒绝服务(DDoS - Distributed Denial of Se…

购买腾讯云服务器请先领取代金券,2024腾讯云优惠

腾讯云优惠代金券领取入口共三个渠道,腾讯云新用户和老用户均可领取8888元代金券,可用于云服务器等产品购买、续费和升级使用,阿腾云atengyun.com整理腾讯云优惠券(代金券)领取入口、代金券查询、优惠券兑换码使用方法…

FL Studio选购指南:新手小白应该选择哪个版本FL Studio?

很多打算入手正版FL Studio的新手朋友都会纠结一个问题:哪个版本的FL Studio更适合我,到底应该入手哪一款FL Studio?本文会介绍每个版本之间的差异点,并带大家选择适合自己的FL Sudio版本。 FL Studio全版本 在选购前有一些小知识…

UE5常见问题处理笔记

一、C工程中的文件出现很多头文件找不到,比如:#include CoreMinimal.h文件提示找不到。 解决方法:在UE编辑器中选择菜单Tools -> Refresh Visual Studio Project。 二、莫名其妙的编译错误。 解决方法,找到工程根目录下的Bi…

GO流程控制

1. if else 在Go语言中,关键字if是用于测试某个条件(布尔型或逻辑型)的语句,如果该条件成立,则会执行 if 后由大括号{}括起来的代码块,否则就忽略该代码块继续执行后续的代码。 if condition {// 条件为真…

qwen.cpp

1、Release模式 git clone --recursive https://github.com/QwenLM/qwen.cpp && cd qwen.cpp git submodule update --init --recursive python3 qwen_cpp/convert.py -i /mnt/workspace/qwen.cpp/Qianwen/qwen/Qwen-7B-Chat -t q4_0 -o qwen7b-ggml.bincmake -B buil…

什么是MAC地址? win10电脑查看MAC地址的多种方法

您是否知道连接到家庭网络的每件硬件都有自己的身份?正如每个设备都分配有自己的 IP 地址一样,每个硬件都有一个唯一的网络标识符。 该标识符称为MAC 地址。MAC 代表媒体访问控制。您可能需要 MAC 地址来解决网络问题或配置新设备。在 Windows 中查找您…

three.js 点乘判断平行向量方向异同

效果&#xff1a; 代码&#xff1a; <template><div><el-container><el-main><div class"box-card-left"><div id"threejs"></div><div>判断的前提是两个向量平行<el-button click"judge"…

一文掌握大模型提示词技巧:从战略到战术

作者&#xff1a;明明如月学长&#xff0c; CSDN 博客专家&#xff0c;大厂高级 Java 工程师&#xff0c;《性能优化方法论》作者、《解锁大厂思维&#xff1a;剖析《阿里巴巴Java开发手册》》、《再学经典&#xff1a;《Effective Java》独家解析》专栏作者。 热门文章推荐&am…

pytest 的 request fixture:实现个性化测试需求

在前文章中&#xff0c;我们看到pytest_repeat源码中有这样一段 pytest.fixture def __pytest_repeat_step_number(request):marker request.node.get_closest_marker("repeat")count marker and marker.args[0] or request.config.option.count......看到参数为r…

Stable Cascade又升级了,现在只需要两个模型

Stable Cascade这个模型&#xff0c;大家如果还有印象的话&#xff0c;是需要下载三个模型的&#xff0c;分别是Stage_a,Stage_b和Stage_c,如果全都下载下来&#xff0c;需要20多个G&#xff0c;但是最近使用ComfyUI做尝试的时候&#xff0c;发现官方的案例中已经没有用到单独的…