volatile关键字和synchronized关键字

volatile和synchronized是Java中处理多线程同步的两种方式。volatile保证了变量的可见性和禁止指令重排序,但不保证原子性,适合简单共享变量的场景。synchronized提供锁机制,保证数据的原子性和可见性,适用于复杂同步操作。相比于synchronized的重量级锁,volatile性能更好,但使用范围更有限。理解两者差异对于优化并发代码至关重要。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

volatile关键字

volatile关键字是轻量级的synchronized(严格来说不是轻量级syn),主要就是保证共享变量的可见性,就是一个线程修改一个变量,对其他的线程是可见的。而且volatile可以通过内存屏障防止指令重排序。内存屏障是一条CPU指令,主要用来确保一些特定操作的执行顺序,Java内存模型将在写操作后插入一个写屏障指令,在读操作前插入一个读屏障指令。内存屏障主要分为读读屏障,写写屏障,读写屏障,写读屏障,写读屏障是万能屏障。

volatile的实现有两点,lock前缀指令可以使处理器缓存重写到内存,而且会使得其他处理器的缓存失效

Volatile实现内存可见性是通过store和load指令完成的;对volatile变量执行写操作时,会在写操作后加入一条store指令,强迫线程将最新的值刷新到主内存中;而在读操作时,会加入一条load指令,即强迫从主内存中读入变量的值。

Lock前缀指令作用

volatile读写操作时,会有个Lock前缀指令,它的作用

  • 将当前处理器缓存行的数据写回到系统内存。

  • 这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据无效。

volatile不是线程安全,因为无法保证操作的原子性,但是可以通过和循环CAS锁机制联用来促使线程安全。循环CAS保证了操作的原子性,锁机制保证了同一时间只有一个线程在进行

synchronized关键字

synchronized是重量级锁,它本来是很重的,但是后来引入了偏向锁和轻量级锁,完成了锁的升级,使得获得锁和释放锁的效率大大降低。

synchronized是可重入锁,修饰的静态方法是可重入的,实现的方法可以调用自己

说说 synchronized 关键字和 volatile 关键字的区别

synchronized 关键字和 volatile 关键字是两个互补的存在,而不是对立的存在!

  • volatile 关键字是线程同步的轻量级实现,所以volatile性能肯定比synchronized关键字要好。但是volatile 关键字只能用于变量而 synchronized 关键字可以修饰方法以及代码块

  • volatile 关键字能保证数据的可见性,但不能保证数据的原子性。synchronized 关键字两者都能保证。

  • volatile关键字主要用于解决变量在多个线程之间的可见性,而 synchronized 关键字解决的是多个线程之间访问资源的同步性。

synchronized和Lock的区别

  • synchronized是关键字,lock是接口

  • synchronized可以锁代码块和方法,lock只能锁代码块

  • synchronized不可得知是否拿到锁,lock可以得知是否拿到锁

  • synchronized是不可中断的,lock既可以中断也可以不中断

  • synchronized会自动释放锁,lock只能手动释放锁

  • synchronized是非公平锁,lock即可以是非公平锁又可以是公平锁

  • lock有一个读写锁,可以提高效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

herrybody

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值