
synchronized与volatile关键字详解
发布日期:2021-05-14 09:31:31
浏览次数:20
分类:精选文章
本文共 1344 字,大约阅读时间需要 4 分钟。
synchronized锁与volatile变量
导航
-
- Java核心概念
- 线程安全
- synchronized锁
- volatile变量
-
- Java基础
- 多线程编程
- 内存模型
- 同步机制
synchronized锁
synchronized是一种同步锁,在Java中用于保证代码块或方法的线程安全。它通过加锁机制确保同一时间只有一个线程能够执行被锁定代码块。
synchronized的使用方法
- 方法级锁定:用于保护实例方法,确保每个实例只能由一个线程访问
- 类级锁定:用于保护静态方法,确保所有实例共享同一锁定
- 代码块级锁定:允许开发者指定锁定对象(如某个实例或类)
synchronized的底层原理
JVM通过 monitor 对象实现同步机制。每个对象都有一个 monitor,用于管理锁定状态。线程在执行monitorenter指令时,会尝试获取monitor的所有权。一旦获得锁定,其他线程必须等待直到锁被释放。
monitor的状态包括无锁、偏向锁、轻量级锁和重量级锁四种形式。轻量级锁在竞争少的情况下使用,能减少线程等待时间;而重量级锁在竞争多的情况下使用,确保线程不再自旋,提高系统吞吐量。
Java对象头的锁存储
Java对象头中的Mark Word存储锁相关信息。Mark Word的结构包括对象的哈希码、分代年龄和锁标志位。当线程请求锁定时,JVM会检查Mark Word中的锁状态,并根据情况进行锁升级或降级。
Mark Word的锁标志位可以是以下几种状态:
- 0:无锁- 1:偏向锁- 2:轻量级锁- 3:重量级锁锁升级与降级机制
锁类型 | 优点 | 缺点 | 适用场景 |
---|---|---|---|
偏向锁 | 加锁和释锁成本低 | 在有锁竞争时会导致线程等待 | 单线程或无竞争场景 |
轻量级锁 | 减少线程等待时间 | 自旋线程会占用CPU资源 | 需要快速响应的场景 |
重量级锁 | 线程不自旋 | 增加线程等待时间 | 需要高吞吐量的场景 |
synchronized的特性
- 可重入性:同一线程可以在外层函数获得锁后,进入内层函数继续执行
- 不可中断性:线程必须等待直到锁被释放
volatile变量
volatile是Java中用于确保共享变量可见性的轻量级关键字。它避免了线程之间的内存不一致问题,但不能保证原子性和线程安全性。
volatile的作用
- 可见性:保证多线程环境下变量的可见性
- 防止指令重排:在多线程环境下防止JVM的指令重排导致的线程安全问题
- 不保证原子性:需要结合其他机制(如AtomicInteger)来实现原子性操作
volatile的底层原理
volatile变量在JMM中的存储机制包括:
1. 不在线程本地内存中存储变量副本2. 每个线程都有自己的缓存,读取和写入主内存时需要通过内存屏障(memory barrier)进行同步通过这种机制,volatile变量确保了线程之间的读写可见性,避免了内存一致性的问题。
synchronized与volatile的对比
- 使用范围:synchronized可以修饰方法和代码块,而volatile只能修饰变量
- 同步机制:synchronized提供线程同步,而volatile只提供可见性
- 性能开销:synchronized的开销较高,volatile的开销较低
发表评论
最新留言
关注你微信了!
[***.104.42.241]2025年04月27日 03时17分57秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
制作JS验证码(简易)
2019-03-11
adb通过USB或wifi连接手机
2019-03-11
Scrapy安装
2019-03-11
vue使用ecahrts词云图
2019-03-11
【README】回溯算法基本框架
2019-03-11
12、继承
2019-03-11
数组中常见的算法
2019-03-11
泛型机制 Generic
2019-03-11
包装类
2019-03-11
JDK9-15新特性
2019-03-11
集合继承结构
2019-03-11
ArrayList 实现类
2019-03-11
LinkedList 实现类
2019-03-11
Vector 实现类
2019-03-11
HashMap类、HashSet
2019-03-11
HashTable类
2019-03-11
TreeSet、TreeMap
2019-03-11
PrintStream
2019-03-11
ObjectInputStream、ObjectOutputStream
2019-03-11