volatile变量的特殊规则

volatile关键字在Java中提供了线程间变量的可见性,并禁止指令重排序。虽然它确保了新值对所有线程的可见性,但并不保证原子性,因此在涉及复合操作时仍需加锁。例如,volatile变量num++的操作可能会导致线程安全问题。volatile确保了读写操作的顺序,防止指令重排序带来的不确定性,保证了特定语句的执行顺序。
摘要由CSDN通过智能技术生成

JVM内存模型专门对volatile定义了一些特殊的访问规则。
volatile修饰的变量有两种特性

保证此变量对所有线程的可见性

这里的可见性,是指当一个线程对此变量进行修改,新值对于其他线程是可以立即得知的,而普通变量做不到这一点,普通变量的值在线程间的传递均需要通过主内存来完成。例如:线程A在修改了变量的值之后,要回写到主内存,而线程B在线程A回写完成之后再从主内存中进行读取,才对线程B是可见的。

volatile虽然可以保证对所有线程的可见性,但是在高并发下依然是不安全的,原因在于Java里的操作并非原子操作。
举个例子,看一段代码:

public class TestVolatile {
   
    public static  volatile int num=0;
    public static void increase(){
   
        num++;
    }

    public static void main(String[] args) {
   
        Thread[] thread 
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值