面时莫慌 | 你好,谈谈对Synchronized的理解?(六)


theme: channing-cyan

紧接着上一篇你好,谈谈对Synchronized的理解?(五),这一篇文章来总结对比volatile和synchronized。

五、对比volatile

前面文章面时莫慌 | 你好,请谈谈volatile关键字?(全篇)详细介绍了volatile关键字的用法,原理。这篇文章我们来总结一下这synchronizedvolatile的主要区别。synchronized用于实现一个基于锁的线程模型;而volatile包括Atomic是非锁定的,这意味着线程不需要锁来访问共享变量。

| synchronized | volatile | | -------------------------------------------------- | ------------------------------------------------ | | 只是适用于块或方法 | 只是适用于变量 | | 它基于的是锁的线程模型 | 借助于硬件,加上非阻塞的算法,是非锁定的 | | 由于锁的是获取和释放,与volatile相比,性能相对较低 | 与synchronized相比,性能相对较高 | | 由于是基于锁,可能会带来并发的风险,比如死锁、活锁 | 由于它是非锁定的,它不会受到死锁、活锁等并发风险 |

总的来说,volatile 不能控制线程对其对象的访问,这允许多个线程对其操作,而不需要等待对象的锁定,所以它性能相当的快,它将确保对变量的任何更改都将被刷新到主内存,然而,访问主存被认为是非常昂贵的,因此直接对主存进行读写的开销是非常大的。

synchronized它保证一段代码一次不会被多个线程访问,消除了所有可能的竞争条件,因为是基于锁,使用它是非常昂贵的,它在一定程度上牺牲了多线程并发的优势--速度。

那么怎么使用这两个关键字呢?除了被使用的不同代码地方,还有下面两个原则。

  • 当变量将被多个线程读取,单只是被一个线程写入时,使用volatile
  • 当多个线程读取和写入变量时使用synchronized

哥佬倌,莫慌到走!觉好留个赞,探讨上评论。欢迎关注面试专栏面时莫慌 | Java并发编程,面试加薪不用愁。也欢迎关注我,一定做一个长更的好男人。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值