synchronized和volatile的区别

synchronized和volatile的区别在于:1、关键字不同;2、修饰功能不同;3、线程阻塞情况不同;4、原子性不同。volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块。

synchronized和volatile的区别-Worktile社区

1、关键字不同

volatile 关键字是线程同步的轻量级实现,所以 volatile 性能肯定比synchronized关键字要好 。但是 volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块。synchronized关键字是防止多个线程同时执行一段代码,就会影响程序执行效率,而volatile关键字在某些情况下性能要优于synchronized。但是要注意volatile关键字是无法替代synchronized关键字的,因为volatile关键字无法保证操作的原子性。

2、修饰功能不同

volatile只能修饰变量,synchronized可以修饰方法、代码块。有volatile修饰的变量,赋值后多执行了一个“load addl $0x0, (%esp)”操作,这个操作相当于一个内存屏障(指令重排序时不能把后面的指令重排序到内存屏障之前的位置),只有一个CPU访问内存时,并不需要内存屏障;(什么是指令重排序:是指CPU采用了允许将多条指令不按程序规定的顺序分开发送给各相应电路单元处理)。

3、线程阻塞情况不同

volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。保证此变量对所有的线程的可见性,这里的“可见性”,如本文开头所述,当一个线程修改了这个变量的值,volatile 保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新。但普通变量做不到这点,普通变量的值在线程间传递均需要通过主内存(详见:Java内存模型)来完成。

4、原子性不同

volatile保证数据的可见性,但不能保证原子性;而synchronized可以保证原子性,也可以间接保证可见性,因为它会将私有内存中和公共内存中的数据做同步。

延伸阅读:

正确使用 volatile 变量的条件

您只能在有限的一些情形下使用 volatile变量替代锁。要使 volatile变量提供理想的线程安全,必须同时满足下面两个条件:

● 对变量的写操作不依赖于当前值。

● 该变量没有包含在具有其他变量的不变式中。

实际上,这些条件表明,可以被写入 volatile变量的这些有效值独立于任何程序的状态,包括变量的当前状态。

名列前茅个条件的限制使 volatile变量不能用作线程安全计数器。虽然增量操作(x++)看上去类似一个单独操作,实际上它是一个由读取-修改-写入操作序列组成的组合操作,必须以原子方式执行,而 volatile 不能提供必须的原子特性。实现正确的操作需要使 x 的值在操作期间保持不变,而 volatile变量无法实现这点。(然而,如果将值调整为只从单个线程写入,那么可以忽略名列前茅个条件。)

大多数编程情形都会与这两个条件的其中之一冲突,使得 volatile变量不能像 synchronized 那样普遍适用于实现线程安全。清单 1 显示了一个非线程安全的数值范围类。它包含了一个不变式 —— 下界总是小于或等于上界。

文章标题:synchronized和volatile的区别,发布者:小编,转载请注明出处:https://worktile.com/kb/p/37797

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
小编小编认证作者
上一篇 2023年2月12日 下午4:17
下一篇 2023年2月12日 下午4:19

相关推荐

  • 工时管理有哪些意义

    工时管理的意义包括以下几点:1、提高企业的工作效率;2、调动员工的工作兴趣;3、激励员工自我提升;4、明确企业规划。工时管理制度实现了企业人力资源的有效配置,最大限度地调动了员工的积极性,提高了企业工作效率和经济效益。 1、提高企业的工作效率 工时制度促使企业从粗放式经营向精细化经营转变,因为工时制…

    2022年11月30日
    1.6K00
  • 实践教程:知识库内容的有效组织和分类

    知识库内容的有效组织和分类的教程:1、明确知识库的目标;2、了解用户需求;3、设计清晰的结构;4、定义标准化的分类体系;5、考虑知识库的生命周期;6、清理和更新现有内容;7、制定内容审查和更新策略;8、建立内容审批流程;9、使用标签进行更灵活的分类;10、定义标准的元数据;11、提供强大的搜索功能;12、使用搜索关键词;13、提供培训和支持;14、推动知识库文化等等。

    2023年11月16日
    42100
  • 编程应该学什么语言

    编程语言的选择应依据个人兴趣、行业需求和学习资源可获取性三大因素考量。对多数人来说,1、Python获取上手难度低、2、JavaScript适用于Web开发、3、Java广泛应用于企业级开发等特点,使它们成为初学者的优选。特别是Python,其简洁的语法和广泛的应用范围(如数据科学、人工智能、网络爬…

    2024年4月26日
    600
  • 光大国际oa系统网址

    标题:光大国际OA系统网址 光大国际的OA系统网址为企业内部办公自动化系统,达成内部文档流转、项目管理、员工协作等功能。通常该系统网址由企业内部IT部门分发,因机密性不对外公开,员工可向人力资源部查询。此外,企业应保持网址稳定性及安全性,确保员工访问无忧。 关于光大国际OA系统网址的详细信息,一个至…

    2024年1月15日
    24600
  • DevOps如何提高容量规划

    DevOps通过自动化工具链、持续集成和持续部署(CI/CD)流程强化、以及基础设施即代码(IaC)概念的应用提高容量规划的效率和准确性。在DevOps实践中,团队能够利用实时监控和数据分析迅速响应需求变化,自动化提供环境的伸缩性,并预测未来的资源需求。其中实时监控和数据分析特别值得展开讨论。通过搜…

    2024年1月18日
    22100
  • 项目部如何管理

    项目部的管理是确保项目成功交付的关键。有效的项目管理应该围绕这几个核心原则:明确项目目标、合理安排资源、精确进度控制、优化团队沟通、及时风险应对。每一个原则都是项目管理成功的基石。在这些原则中,精确进度控制尤为重要,因为它直接关系到项目是否能在预定时间内完成。这需要管理者不仅要制定详尽的进度计划,还…

    2024年4月10日
    4600
  • ERP系统能否帮助企业实现数字化转型

    企业资源计划(ERP)系统是企业实现数字化转型的关键工具。它通过整合各项业务流程以提升运营效率、降低成本、增强数据分析与决策能力,推动企业进入数字化时代。首要被提升的核心指标包括:1、完成度,标志着ERP系统是否能全面覆盖企业各个业务领域;2、实时性,确保数据的即时更新与共享;3、灵活性,体现在系统…

    2023年11月27日
    39500
  • signal signalAll 的区别是啥

    signal signalAll 的区别是:condition的signal是将等待队列中的first节点放入同步队列,并通过调用unpark方法来唤醒线程。signalAll就是signal的while循环,将所有等待队列中的node放入同步队列,并逐一唤醒。线程被唤醒之后,还是需要去尝试获得锁,…

    2023年2月7日
    80100
  • 编程到底难在哪里

    编程难在:1、思维模式的切换;2、语言上的难度;3、超强的对耐心的挑战;4、需要复杂场景下的调度和场面掌控能力。维模式的切换是指编程需要有技术思维,能够成功建模,能在在两种思维模型之间转换,一种是看到的感受到的外行人视角,一种是技术思维。

    2023年1月12日
    70300
  • MySql有什么有效的优化参数设置的方法

    方法有:一、开启查询缓存;二、调整连接线程池大小;三、 调整InnoDB缓存池大小;四、调整MyISAM缓存大小;五、调整查询缓存大小;六、调整最大连接数;七、调整表缓存大小;八、调整临时表大小;九、调整排序缓存大小;十、调整线程栈大小。 一、开启查询缓存 查询缓存可以将查询结果缓存到内存中,以便在…

    2023年5月30日
    36800

发表回复

登录后才能评论
注册PingCode 在线客服
站长微信
站长微信
电话联系

400-800-1024

工作日9:30-21:00在线

分享本页
返回顶部