多线程——volatile

本文介绍了在多线程环境中volatile关键字的作用和原理。volatile确保了变量在多个线程间的可见性,避免了线程安全问题。它通过Lock指令实现处理器缓存的更新和同步,但不保证原子性。相比synchronized,volatile不造成线程阻塞,使用更轻量级。
摘要由CSDN通过智能技术生成

        在多线程中,为了使得某个变量对任意一个线程可见,会使用volatile对该变量进行修饰。

        理解volatile之前,要先知道线程是如何调用变量的。每一个线程都拥有自己的一个私有堆栈,变量是定义在主内存中,而每个线程会将变量copy一份到私有堆栈。每次启动线程操作,都会先从主内存读取熟读到私有堆栈,然后已知只会对copy过来的变量进行读写,当线程结束的时候,就会将变量写回主内存。这里会出现线程安全问题,当线程A读取了主内存的变量V之后,线程B更改主内存的变量V的值,那么实际上线程A操作的变量V的值不是当前实际的值,如下图。

        volatile就是为了解决上述问题。当对使用volatile修饰的共享变量进行读写操作时,在编译成字节码命令时会多出Lock前缀指令,Lock指令的作用:

1)引起处理器缓存写回主内存;

2)如果其中一个处理器缓存写回到主内存,意味着会导致其他处理器的本地缓存失败;

3)当处理器发现本地缓存失效,就会从主内存中重新读取该变量的数据。

换句话说,每次对被volatile修饰的共享变量进行写操作是,都会更新该变量在主内存的值,同时强迫其他线程重新读取一次该线程的值到各自的本地缓存,如下图。

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值