volatile关键字

volatile在多处理器开发中保证了共享变量的“可见性”,可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。

1.volatile的实现原理

为了提高处理速度,CPU不直接和内存进行通信,而是先将系统内存的数据读到CPU自己的内部缓存后在进行操作,但操作完成后,不知道何时会写回到内存中。

如果CPU1上的线程修改完CPU1缓存里的值,尚未写回到内存的时候,CPU2上的线程来访问共享数据了,也是先把数据读取到CPU2的缓存里,因为读取的是旧数据,所以接下来的操作肯定会发生数据错误的问题。

如果为某个变量加上volatile关键字后,如果CPU1上的线程要修改这个共享变量,当然也需要先缓存到CPU1的内部缓存中,但JVM同时会向CPU1发送一条lock前缀的指令,告诉CPU1将缓存中修改的数据写回到系统内存中。这样其他线程再修改时,从系统内存中读取的就是新的。

但是即便是写回到系统内存,其他CPU里缓存的也还是旧值,所以这条指令的另一个作用就是让其他CPU缓存中的旧数据失效。如果要对共享数据修改,就需要重新从内存读取一次,这样自然就是新值了。

你可能感兴趣的:(volatile关键字)