当前位置: 首页 > news >正文

Synchronized 用过吗,其原理是什么???

Synchronized 有以下几个特点:

  1. 互斥性:Synchronized 保证同一时刻只有一个线程可以获取锁,并且只有该线程可以执行同步代码块中的代码。

  2. 可重入性:同一个线程可以多次获取同步锁而不会被阻塞,这样可以避免死锁的发生。

  3. 独占性: 如果一个线程获得了对象的锁,则其他线程必须等待该线程释放锁之后才能获取锁。

  4. 缺点:非公平锁 ,当锁被释放后,任何一个线程都有机会竞争得到锁,这样做的目的是提高效率,但缺点是可能产生线程饥饿现象。

Synchronized锁的升级过程

  1. 无锁

    当一个对象被创建时,它最初是没有锁状态的,即处于无锁状态。

  2. 偏向锁

    当第一个线程访问同步块时,如果该对象没有其他线程竞争,JVM会将对象头的Mark Word中的偏向线程ID设置为当前线程ID,并将Mark Word中的锁标志位改为偏向锁状态。这样,当前线程再次进入同步块时,无需再次获取锁,提高了效率。

  3. 轻量级锁(自旋锁)

    偏向锁是轻量级锁的一种。

    当有多个线程同时进入,来准备争夺这个共享资源时,此时会升级成自旋锁。新进入的线程会进入自旋等待状态。假如在自旋超过所设置的最大全数(不是固定的,假如是10),此时,锁会升级成为重量级锁

  4. 重量级锁(操作系统的内核态)

    此时线程的处理将有操作系统来判断,看是否要对于该线程进行分配新的内存进行处理。

如果自旋锁超过了系统设定的阈值(默认10次,可以通过参数调整),或者在自旋期间有其他线程正在等待(已经进入了阻塞队列),那么锁会被升级为重量级锁。这时,JVM会创建一个互斥锁(Monitor),并将Mark Word中的锁标志位改为重量级锁状态。线程需要通过OS的调度器获取CPU时间片才能继续执行,这通常涉及从用户态到内核态的切换,性能开销较大。

总结

前三种锁都是在操作系统的用户态下执行的,重量级锁则是在操作系统的内核态执行。

一般来说,锁能在用户态下执行完成,都尽量不进入重量级锁,由操作系统进行处理。在保证线程安全的同时,尽可能减少锁带来的性能损耗。

相关文章:

  • 理解数学概念——线性(线性性)
  • Android: Null extracted folder for artifact: ResolvedArtifact(xxx 项目编译失败
  • Socket编程学习笔记之TCP与UDP
  • LabVIEW结构体内部缺陷振动检测
  • Android之保存图片到相册之前兼容不同机型需要注意的配置
  • 上岸北科大计算机专业难度有多大?北京科技大学计算机考研考情分析!
  • 【kubernetes】k8s集群安全机制 保姆级攻略
  • yg校园易购电商系统(Go+Vue)
  • DevExpress Installed
  • 人邮学院明日科技web前端开发案例教程(慕课版)第六章习题
  • java kotlin python 日志记录
  • 再度牵手,制造升级 | 毅达科技IMS OS+通用产品集+行业套件项目正式启动!
  • 【乐吾乐3D可视化组态编辑器】用开关控制巡检车和路灯
  • 艾宾浩斯winform单词系统+mysql
  • VMware导入vmdk文件(亲测有效)
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • .pyc 想到的一些问题
  • [分享]iOS开发-关于在xcode中引用文件夹右边出现问号的解决办法
  • 【从零开始安装kubernetes-1.7.3】2.flannel、docker以及Harbor的配置以及作用
  • CSS 三角实现
  • DataBase in Android
  • HTTP中的ETag在移动客户端的应用
  • JS+CSS实现数字滚动
  • Laravel核心解读--Facades
  • PHP的Ev教程三(Periodic watcher)
  • Python_OOP
  • Python十分钟制作属于你自己的个性logo
  • Redis提升并发能力 | 从0开始构建SpringCloud微服务(2)
  • seaborn 安装成功 + ImportError: DLL load failed: 找不到指定的模块 问题解决
  • VuePress 静态网站生成
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 聚类分析——Kmeans
  • 猫头鹰的深夜翻译:Java 2D Graphics, 简单的仿射变换
  • 实现简单的正则表达式引擎
  • 我的业余项目总结
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 教程:使用iPhone相机和openCV来完成3D重建(第一部分) ...
  • ​2021半年盘点,不想你错过的重磅新书
  • ​卜东波研究员:高观点下的少儿计算思维
  • # 手柄编程_北通阿修罗3动手评:一款兼具功能、操控性的电竞手柄
  • #我与Java虚拟机的故事#连载08:书读百遍其义自见
  • (11)MATLAB PCA+SVM 人脸识别
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (delphi11最新学习资料) Object Pascal 学习笔记---第5章第5节(delphi中的指针)
  • (zt)最盛行的警世狂言(爆笑)
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二)windows配置JDK环境
  • (附源码)springboot社区居家养老互助服务管理平台 毕业设计 062027
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (蓝桥杯每日一题)love
  • (全注解开发)学习Spring-MVC的第三天
  • (四)docker:为mysql和java jar运行环境创建同一网络,容器互联
  • (原創) 物件導向與老子思想 (OO)
  • .NET 8 中引入新的 IHostedLifecycleService 接口 实现定时任务
  • .Net core 6.0 升8.0