线程-volatile关键字

来源:互联网 发布:阿里云控制台 编辑:程序博客网 时间:2024/05/22 12:20

volatile关键字概念:主要作用是让变量在多个线程之间可见,并不具备原子性。

在java中每个线程都有一个工作内存区,每个工作内存区中都拷贝了一份所有被共享的主内存中的变量,线程在自己的工作内存中所操作的这些变量都是拷贝过来的,不用再去主内存中去获取了。

volatile的作用就是强制线程到主内存(共享内存)中去读取被volatile修饰的变量,而不去线程工作内存中去获取,从而实现了多个线程的变量可见,也就满足了线程安全的可见性。

volatile不能满足原子性(同步),如果想要保持同步建议选用AtomicInteger。



在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变量读取到一个线程本地内存中;以后再取变量值时,就直接从本地内存中取值;当变量值在本线程里改变时,会同时把变量的新值copy到本地内存中,以便保持一致;在某个特定的时候,将本地内存的更改写到系统主内存中去;当变量在因别的线程等而改变了值,并且该变化没有写到系统主内存,本次线程的本地内存中的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致;但是当变量被volatile修饰后,每次更改该变量的时候会将更改结果写到系统主内存中,利用多处理器的缓存一致性,其他处理器会发现自己的缓存行对应的内存地址被修改,就会将自己处理器的缓存行设置为失效,并强制从系统主内存获取最新的数据。这样就能保证即使在别的线程中改变了该变量的值,在本线程中也能取到最新更改后的值。

0 0
原创粉丝点击