volatile 关键字如何保证内存可见性

为什么新线程对主线程进行的变量修改没有察觉?

1、JIT编译器对新线程的代码进行优化,导致新线程在线程上下文中察觉不到变量的修改

2、新线程可能会从本地缓存或是寄存器中获取变量数据,而不是从速度更慢的内存中获取

volatile 关键字如何保证内存可见性?

volatile标记的变量,会警告JIT编译器,标记volatile标记的变量可能会被其他线程修改,不要执行任何可能影响其访问顺序的优化。

也就是说:线程每次获取该变量数据的时候,都要从内存中获取。

但是每次都从内存中获取,会导致程序性能的降低,而且多线程的请款下,对volatile变量的访问时各自独立处理的,这些访问很难一直统一,因此也无法保证整体操作的原子性。

小结:

1、volatile修饰的变量保证内存可见性

2、volatile修饰的变量不会进行指令重排

备注:

什么是JIT?

just in time,即时编译编译器。

java代码执行的时候,会先通过javac命令将代码编译成class文件,到之后执行,代码会分为两类:

1、频繁执行的代码(热点代码):会直接编译成机器可以直接执行的二进制文件,同时保存起来,便于复用

2、不频繁执行的代码:通过解释器执行

由上图我们也能看出,java语言属于编译解释型语言!其实:

解释性或编译性和语言本身是没有关系的,即解释性或编译性可以看作是一种语言的状态解释性或编译性和语言本身是没有关系的,即解释性或编译性可以看作是一种语言的状态

参考博客:传送门1传送门2

发布了219 篇原创文章 · 获赞 292 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/lk1822791193/article/details/104691315
今日推荐