volatile关键字与synchronization关键字的区别?

    在我们平时写代码需要同步的时候我们都会想到要使用同步锁(synchronization),但是我们都知道这个是效率比较低的。我了解了一个新的一个关键字,那就是volatile,这个的关键字它是Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。

使用volatile的前提条件:

  1、对变量的写操作不依赖于当前值

  2、该变量没有包含在具有其他变量的不变式中 简单来说,就是保证该操作是原子性操作

接下来我们来看两张图: 

  图左,是没有加volatile关键字的,原始线程的变量保存,要先存在工作内存中,在写入主内存。所以用户可能用到的是脏数据。

  图右,是加了volatile关键字后的线程,变量跳过工作内存直接写入主内存,保证了线程的可见性。

接下来就是volatile关键字与synchronization关键字的区别之处

好了,今天的分享就到这里了,谢谢大家。

posted @ 2018-12-05 15:55  huangzhixin  阅读(257)  评论(0编辑  收藏  举报