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

javaEE——synchronized关键字

目录

  • 前言
  • 1. synchronized特性
  • 2. synchronized的使用
    • 2.1 修饰实例方法
    • 2.2 修饰静态方法
    • 2.3 同步代码块
  • 3. synchronized的锁机制
  • 总结

前言

在前面已经零零散散的介绍了synchronized关键字,这篇文章对其进行总结。

1. synchronized特性

在JDK1.8,synchronized有如下特性:

  1. 开始时是乐观锁, 如果锁冲突频繁, 就转换为悲观锁.
  2. 开始是轻量级锁实现, 如果锁被持有的时间较长, 就转换成重量级锁.
  3. 实现轻量级锁的时候⼤概率⽤到的⾃旋锁策略
  4. 是一种不公平锁
  5. 是一种可重入锁
  6. 不是读写锁

2. synchronized的使用

某个线程执⾏到某个对象的 synchronized 中时, 其他线程如果也执⾏到同⼀个对象 synchronized 就会阻塞等待.
进⼊ synchronized 修饰的代码块, 相当于 加锁
退出 synchronized 修饰的代码块, 相当于 解锁

2.1 修饰实例方法

public synchronized void method() {// 同步代码
}

锁对象是当前实例对象(this)
同一实例的同步方法在同一时刻只能被一个线程访问

2.2 修饰静态方法

public static synchronized void staticMethod() {// 同步代码
}

锁对象是当前类的Class对象(类锁)
所有实例的同步静态方法在同一时刻只能被一个线程访问

2.3 同步代码块

// 锁对象是obj
synchronized(obj) {// 同步代码
}
// 锁对象是当前实例
synchronized(this) {// 同步代码
}// 锁对象是类的Class对象
synchronized(ClassName.class) {// 同步代码
}

可以更细粒度地控制同步范围
可以指定任意对象作为锁

3. synchronized的锁机制

在上篇文章说到,JVM将synchronized分为无锁、偏向锁、轻量级锁、重量级锁状态,会依次进行升级。

  1. 无锁状态:对象刚创建时的状态

  2. 偏向锁:
    适用于只有一个线程访问同步块的场景
    通过CAS操作在对象头和栈帧中记录线程ID(实际上并没有加锁,只是做了个标记)
    同一线程再次进入时无需同步操作

  3. 轻量级锁(自旋锁):
    当有多个线程轻度竞争时
    通过CAS操作将对象头中的Mark Word替换为指向锁记录的指针,如果更新成功,则认为加锁成功。
    如果线程通过自旋尝试获取锁,避免线程阻塞

  4. 重量级锁:
    当竞争激烈时,自旋不能快速获取到锁状态
    使用操作系统的互斥量(mutex)实现
    执行加锁操作,先进入内核态,判定当前锁是否被占用
    如果没有被占用,则加锁成功,切换回用户态
    如果被占用,线程则是未获取锁的状态,对于未获取锁的线程,挂起,进入阻塞状态。

总结

本篇文章系统的总结了synchronized关键字,看完这篇文章后,希望你能对这个关键字有更加透彻的理解。

http://www.xdnf.cn/news/1107001.html

相关文章:

  • Linux解决vim中文乱码问题
  • Spring AOP 是如何生效的(入口源码级解析)?
  • leetcode:HJ18 识别有效的IP地址和掩码并进行分类统计[华为机考][字符串]
  • 【Datawhale AI夏令营】mcp-server
  • [Python] Flask 多线程绘图时报错“main thread is not in main loop”的解决方案
  • 【unity实战】在Unity实现低耦合可复用的交互系统
  • 14. 请谈一下浏览器的强缓存和协商缓存
  • 基于大模型的鼻咽癌全周期预测及诊疗优化研究报告
  • YOLO家族内战!v5/v8/v10谁才是你的真命天子?(附保姆级选择指南)
  • 推荐系统-数据分割、性能验证
  • 开源 python 应用 开发(五)python opencv之目标检测
  • (LeetCode 面试经典 150 题 ) 209. 长度最小的子数组(双指针)
  • Vue.js:从 Web 到桌面的跨端实践与技术选型指南
  • 华为IPD(集成产品开发)流程是其研发管理的核心体系
  • pdf合并
  • 基于Java的Markdown到Word文档转换工具的实现
  • 解决‘vue‘ 不是内部或外部命令,也不是可运行的程序
  • css 判断是ios设备 是Safari浏览器
  • el-tree 懒加载 loadNode
  • 柯里化入门:拆拆拆,拆出函数式编程的优雅
  • OSPFv3-一二类LSA
  • Qt:QCustomPlot类介绍
  • Qt窗口:菜单栏
  • 【攻防实战】记一次DC2攻防实战
  • 华为 GaussDB :技术特性、应用局限与市场争议
  • Java使用Langchai4j接入AI大模型的简单使用(二)
  • windows电脑远程win系统服务器上的wsl2
  • OneCode 3.0架构升级:注解驱动与开放接口生态详解
  • 数据结构栈的实现(C语言)
  • 《Java Web程序设计》实验报告五 Java Script学习汇报