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的开销较低
上一篇:JS字符串与数组的相互转换
下一篇:JSON、JSONObject、JavaBean三者的相互转换

发表评论

最新留言

关注你微信了!
[***.104.42.241]2025年04月27日 03时17分57秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章