synchronized 和 volatile 的区别是什么?

synchronized保证原子性和可见性,通过锁对象的monitor实现,同一时刻仅一个线程可执行同步代码块;volatile仅保证可见性,禁止指令重排序,适用于状态标志等场景。两者性能与适用场景不同,需根据需求选择。此外,Java还提供Lock、原子类、并发集合等更灵活的同步机制

synchronized 和 volatile 的区别是什么?

synchronized 和 volatile,这两个 Java 关键字,就像武林中的两门绝学,虽然都能提升多线程环境下的数据安全,但修炼心法和适用场景却大相径庭。简单来说,

synchronized

是重量级锁,保证原子性和可见性,而

volatile

是轻量级同步机制,只保证可见性。

synchronized 和 volatile 的区别

synchronized 到底锁了什么?

synchronized

可不是简单地给变量加个锁这么简单。它锁的是对象。更准确地说,是对象的 monitor(监视器)。每个 Java 对象都关联一个 monitor,当线程进入

synchronized

修饰的代码块或方法时,它会尝试获取该对象的 monitor。如果 monitor 已经被其他线程持有,那么该线程就会进入阻塞状态,直到 monitor 被释放。

synchronized

保证原子性的方式是,同一时刻只有一个线程可以持有对象的 monitor,因此对该对象的任何操作都相当于串行执行,避免了竞态条件。

synchronized

保证可见性的方式,则是在线程释放 monitor 时,会将工作内存中的变量值刷新到主内存中,并且在线程获取 monitor 时,会从主内存中重新加载变量值到工作内存中。这样就保证了不同线程之间对共享变量的可见性。

举个例子,假设我们有一个计数器类:

public class Counter {    private int count = 0;    public synchronized void increment() {        count++;    }    public synchronized int getCount() {        return count;    }}

在这个例子中,

increment()

getCount()

方法都使用了

synchronized

关键字。这意味着,当一个线程调用

increment()

方法时,它会获取

Counter

对象的 monitor。其他线程如果也想调用

increment()

getCount()

方法,就必须等待第一个线程释放 monitor。这样就保证了

count

变量的原子性和可见性。

但是,

synchronized

也有缺点,那就是性能开销比较大。线程在获取 monitor 时,需要进行上下文切换,这会消耗大量的 CPU 时间。此外,

synchronized

还会导致线程阻塞,降低程序的并发性。

volatile 只能保证可见性,那它有什么用?

volatile

关键字告诉 JVM,该变量的值可能被多个线程同时修改,因此每次使用该变量时,都应该从主内存中重新加载。这样就保证了不同线程之间对该变量的可见性。

但需要注意的是,

volatile

只能保证可见性,不能保证原子性。也就是说,如果多个线程同时修改一个

volatile

变量,仍然可能出现竞态条件。

例如:

魔乐社区 魔乐社区

天翼云和华为联合打造的AI开发者社区,支持AI模型评测训练、全流程开发应用

魔乐社区 102 查看详情 魔乐社区

public class VolatileCounter {    private volatile int count = 0;    public void increment() {        count++; // 这是一个复合操作,不是原子性的    }    public int getCount() {        return count;    }}

在这个例子中,

count

变量使用了

volatile

关键字。虽然

volatile

保证了

count

变量的可见性,但

increment()

方法中的

count++

操作并不是原子性的。它实际上包含了三个步骤:

读取

count

的值。将

count

的值加 1。将结果写回

count

如果多个线程同时执行

increment()

方法,那么可能会出现以下情况:

线程 A 读取

count

的值为 10。线程 B 读取

count

的值为 10。线程 A 将

count

的值加 1,得到 11,然后将 11 写回

count

。线程 B 将

count

的值加 1,得到 11,然后将 11 写回

count

最终,

count

的值是 11,而不是 12。这就是竞态条件。

那么,

volatile

到底有什么用呢?

volatile

最常用的场景是作为状态标志,例如:

public class Worker {    private volatile boolean running = true;    public void start() {        new Thread(() -> {            while (running) {                // 执行一些任务            }            System.out.println("Worker stopped.");        }).start();    }    public void stop() {        running = false;    }}

在这个例子中,

running

变量使用了

volatile

关键字。当调用

stop()

方法时,

running

的值会被设置为

false

。由于

running

volatile

变量,所以所有线程都会立即看到这个变化,从而停止执行任务。

何时使用 synchronized,何时使用 volatile?

这其实是一个权衡的问题。

需要保证原子性:必须使用

synchronized

或其他原子类(如

AtomicInteger

)。

volatile

无能为力。只需要保证可见性,并且对变量的写操作不依赖于当前值:可以使用

volatile

。例如,上述的状态标志。性能要求较高:如果

synchronized

带来的性能开销过大,可以考虑使用

volatile

,但前提是必须满足上述条件。

总的来说,

synchronized

是一个更强大的同步机制,可以保证原子性和可见性,但性能开销也比较大。

volatile

是一个轻量级的同步机制,只能保证可见性,但性能开销比较小。在选择使用哪个关键字时,需要根据具体的场景进行权衡。

除了 synchronized 和 volatile,还有哪些同步机制?

Java 并发编程的世界远不止

synchronized

volatile

这么简单。还有很多其他的同步机制,例如:

Lock 接口及其实现类

Lock

接口提供了比

synchronized

更灵活的锁机制,例如可重入锁

ReentrantLock

、读写锁

ReadWriteLock

等。

Lock

需要手动释放锁,因此需要放在

try...finally

块中。原子类

java.util.concurrent.atomic

包下提供了一系列的原子类,例如

AtomicInteger

AtomicLong

AtomicReference

等。这些类使用 CAS(Compare-and-Swap)算法来实现原子操作,性能通常比

synchronized

更高。并发集合

java.util.concurrent

包下提供了一系列的并发集合,例如

ConcurrentHashMap

CopyOnWriteArrayList

等。这些集合针对并发场景进行了优化,可以提供更高的并发性能。CountDownLatch、CyclicBarrier、Semaphore:这些是 Java 并发包中提供的同步工具类,用于协调多个线程之间的执行。

选择哪种同步机制,取决于具体的并发场景和性能要求。没有银弹,只有最适合的工具。理解每种工具的优缺点,才能在并发编程的世界里游刃有余。

以上就是synchronized 和 volatile 的区别是什么?的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/593400.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年11月10日 16:54:36
下一篇 2025年11月10日 17:00:15

相关推荐

  • Trusta.AI(TA)币是什么?TA代币经济学、发展潜力及市场定位

    目录 Trusta AI 是什么?为 AI 输出构建信任的链上协议Trusta.AI 的愿景:AI 与人类身份共存AI 身份觉醒意味着什么?TA 的代币经济模型TA 的内核用途市场定位与发展潜力风险评估与挑战分析技术挑战市场风险代币风险结论常见问题 FAQ‍ 了解 ta 是什么,深入解析 trust…

    2025年12月11日
    000
  • 比特币价格预测:全球债市崩溃!BTC飙至15万美元只是时间问题?一文了解

    目录 比特币的历史蓝图比特币(BTC/USD)短期技术分析比特币(BTC/USD)长期技术展望新预售Bitcoin Hyper($HYPER)结合比特币安全与Solana速度‍ 根据最新市场动态,比特币(BTC)价格在109,500美元附近获得支撑后,目前交投于约111,000美元。基本面方面,全球…

    2025年12月11日 好文分享
    000
  • 匿名币的回归?隐私保护成为新趋势

    隐私保护正成为加密货币新趋势,匿名币通过环签名、隐形地址、零知识证明和CoinJoin等技术实现交易匿名性,应对区块链透明性带来的隐私挑战。在数据泄露频发、监管趋严和用户追求金融自由的背景下,Monero、Zcash、Dash等匿名币因能保护用户隐私而受到关注,但其发展仍面临监管压力、合法性争议、交…

    2025年12月11日
    000
  • MEME币卷土重来:社区热度与新玩法

    加密货币市场的浪潮总是起伏跌宕,而近期,一股熟悉又充满活力的力量——meme币,正以不可阻挡之势强势回归,再次成为加密社区热议的焦点。从最初的狗狗币(doge)和柴犬币(shib)引爆市场,到如今层出不穷的新兴meme项目,它们凭借着独特的社区文化、病毒式传播效应和颠覆传统金融的叙事,吸引了全球数百…

    2025年12月11日
    000
  • CBDC数字货币:各国央行数字货币最新进展

    全球金融领域正在经历一场深刻的变革,其中最具颠覆性的趋势之一便是央行数字货币(cbdc)的兴起。不再是科幻小说中的概念,cbdc正逐渐从理论走向实践,成为各国央行探索未来货币体系的重要方向。从西方成熟经济体到新兴市场国家,各国政府都在积极评估和推进cbdc项目,旨在解决传统支付系统的效率低下、跨境交…

    好文分享 2025年12月11日
    000
  • 跨链互操作性:打通区块链孤岛的新代币

    区块链孤岛因技术差异导致资产与数据无法互通,跨链互操作性通过侧链、HTLC、跨链桥等机制实现连接,新代币在其中承担治理、费用支付、质押、激励和价值捕获等核心功能,推动生态发展。 区块链技术的飞速发展,如同构建了一座座数字化的城市,每座城市都拥有独特的经济体系和运行规则。然而,这些城市之间却常常存在着…

    2025年12月11日
    000
  • Web3AI ($WAI)横空出世:能否复制比特币神话?

    web3ai ($wai) 的横空出世,无疑为加密货币市场注入了一股新的活力与无尽的遐想。如同当年比特币横空出世,以一种颠覆性的姿态改变了人们对货币和价值的认知,web3ai 也带着其独特的魅力和技术愿景,试图在人工智能与区块链融合的广阔天地中开辟一片新天地。许多人都在思考,这个结合了当下两大前沿技…

    好文分享 2025年12月11日
    000
  • 小市值潜力币:低调布局,高额回报

    在波澜壮阔的加密货币市场中,比特币和以太坊等主流币种固然吸引眼球,但真正的财富密码往往隐藏在那些尚未被广泛关注的**小市值潜力币**中。这些市值相对较小、价格波动剧烈的数字资产,如同等待被挖掘的金矿,蕴藏着令人瞠目结舌的成长潜力。它们可能在某个不经意的瞬间,凭借创新的技术、独特的应用场景或强大的社区…

    好文分享 2025年12月11日
    000
  • 用五千元如何在币圈牛市赚到百万

    在加密货币的牛市周期中,市场情绪高涨,资金大量涌入,为小额资本创造了实现指数级增长的理论可能性。将五千元的初始本金增值至百万,意味着需要实现近两百倍的回报。这并非一个简单的押注游戏,而是一场涉及策略、信息、情绪控制和时机把握的综合性博弈。 2025主流数字货币交易所: 1、欧易OKX: 注册入口: …

    2025年12月11日
    000
  • 用几百元如何在币圈一年赚到五十万

    在数字货币的浪潮中,用几百元的微小资本,在一年时间内实现到五十万的跨越,这是一个引人入胜的话题。这个过程充满了不确定性和极高的风险,但确实存在一些被市场验证过的路径。这些路径并非坦途,它们要求参与者具备敏锐的洞察力、果断的执行力以及超乎常人的心理承受能力。这条道路不适合寻求稳定增值的投资者,它更像是…

    2025年12月11日
    000
  • 如何用一千元在币圈一周翻十倍

    在数字货币这个充满机会与风险的领域,利用有限的本金在短时间内实现资产的巨大增值,是许多参与者追求的目标。一千元的本金,虽然数额不大,但在特定的策略和市场环境下,理论上存在着实现快速增值的路径。这些路径往往伴随着极高的不确定性和风险,需要参与者具备敏锐的洞察力、果断的执行力以及承受巨大波动的心理素质。…

    2025年12月11日
    000
  • 一文搞清楚即使现货以太坊ETF流出3亿美元,ETH衍生品仍转向看涨

    目录 核心观察:以太坊(ETH)衍生品表现坚挺,5000美元大关前景仍不明朗 ‍ 尽管现货以太坊(ETH)ETF遭遇3亿美元资金外流,但衍生品市场的稳健表现与机构参与度的提升,仍为以太坊(ETH)冲击5000美元提供了支撑动力。 核心观察: 美国上市的现货以太坊ETF录得3亿美元净流出,相当于管理资…

    2025年12月11日 好文分享
    000
  • RedStone (RED)是什么币?RED代币经济学、未来展望及价格预测

    目录 什么是RedStone (RED)?RedStone(RED)的运作原理RedStone 的主要特征RedStone 的技术架构与数据处理方式数据来源与验证机制四种数据检索模式RedStone Actively Validated Service(AVS)RedStone 的应用场景1.去中心…

    2025年12月11日
    000
  • 哪里可以盘点购买虚拟币的app

    在虚拟币交易逐渐升温的背景下,市面上涌现出大量用于购买虚拟币的应用程序。然而需要明确的是,虚拟币交易在中国并不受法律保护,且伴随着较高的风险。以下是几款常见的虚拟币交易app介绍,帮助大家更清楚地认识相关情况。 火币app 火币是虚拟币领域内较具影响力的平台之一,其移动端应用功能较为完善。该app支…

    2025年12月11日
    000
  • Web3.0新星:深度解析最新加密项目

    Web3.0的核心是去中心化、用户所有权和透明性,本文深度解析其热门赛道如DeFi、NFT、GameFi及DAO,并介绍项目评估维度与MetaMask存储操作指南,同时提醒投资者关注技术风险、市场波动和监管不确定性等挑战。 Web3.0的浪潮正以前所未有的速度席卷全球,它不仅仅是互联网的下一代,更代…

    2025年12月11日
    000
  • 元宇宙概念币再爆发:哪些新秀值得关注

    元宇宙概念币爆发源于技术成熟、区块链赋能、疫情加速线上化及巨头布局等多重因素,投资者应关注技术创新、团队背景、社区活跃度、经济模型等维度筛选项目,并可通过币安、欧易、火币等主流交易所参与投资,但需注意高风险。 元宇宙,这个融合了虚拟现实、增强现实、区块链等前沿技术的概念,正以惊人的速度重塑着我们的数…

    2025年12月11日
    000
  • NFT市场新动向:艺术、收藏与新发行代币

    nft市场,这个曾经只存在于极客圈层的新兴事物,如今已如同一股不可阻挡的浪潮,彻底颠覆了我们对艺术、收藏乃至数字资产的认知。它不再仅仅是数字图片和视频的简单组合,而是演变成了一个充满活力、持续创新的生态系统。从数百万美元的数字艺术品到风靡全球的加密朋克(cryptopunks),nft以其独一无二、…

    好文分享 2025年12月11日
    000
  • RWA代币化:传统资产与区块链的融合新尝试

    随着区块链技术的不断成熟与应用场景的拓展,一个引人瞩目的新领域——rwa(real world assets)代币化——正以其独特的魅力吸引着全球的目光。它并非遥不可及的未来概念,而是当下正在发生的深刻变革,将传统金融市场中那些流动性较低、难以分割或投资门槛较高的实物资产,通过区块链技术转化为可交易…

    好文分享 2025年12月11日
    000
  • 比特币还能买吗?2025年最新分析与投资策略深度解读

    关于2025年比特币是否还值得购买,答案是复杂的,它高度依赖于个人的投资目标、风险承受能力以及对市场周期的理解。从宏观角度看,2025年处于比特币第四次“减半”后的关键时期,历史上减半后的一年到一年半往往是牛市的高峰阶段。此外,机构采用率的增加、现货etf的批准以及全球宏观经济环境(如利率政策)的变…

    2025年12月11日
    000
  • 币圈波段操作:如何用三千资金周赚三万

    在数字货币市场中,波段操作是一种常见的交易策略,它旨在捕捉资产在短期内的价格波动以获取收益。对于小额资金而言,想要实现快速增值,通常意味着需要承担极高的风险,并结合精准的市场判断、严格的执行纪律以及对工具的熟练运用。三千资金的目标是周赚三万,这代表着十倍的收益率,在传统金融市场几乎是天方夜谭,但在加…

    2025年12月11日
    000

发表回复

登录后才能评论
关注微信