java中volatile关键字的作用是,java volatile用法

  java中volatile关键字的作用是,java volatile用法

  00-1010 1.挥发性2。什么是能见度3。什么是总线锁和缓存锁4。什么是指令重排序?

  00-1010可以保证多线程环境下共享变量的可见性,并通过增加内存屏障来防止多条指令之间的重新排序。

  00-1010可见性意味着当一个线程修改一个共享变量时,其他线程可以立即看到修改后的值。可见性本质上是由几个方面造成的。

  Cpu级缓存,在cpu中,三级缓存的设计是为了解决cpu运行效率和内存IO效率的问题,但是也带来了一个缓存一致性的问题。在多线程执行的情况下,缓存一致性的问题会导致可见性的问题。所以对于一个添加了volatile关键字的修改后的共享变量,jvm虚拟机会自动添加一个#lock汇编指令,这个指令会根据不同的cpu型号自动添加总线锁或者缓存锁。

  00-1010总线锁锁定cpu的前端总线,使得同一时刻只有一个线程可以与内存通信,避免了多线程并发带来的可见性问题。缓存锁是对总线锁的一种优化,因为总线锁会导致cpu利用效率的大幅下降。因此,缓存锁只锁定cpu三级缓存中的目标数据,缓存锁由MESI缓存一致性协议实现。

  00-1010指令重排序指令在数据顺序和执行顺序上不一致,导致多线程环境下的可见性问题。指令重排序本质上是一种性能优化的手段,指令重排序来自几个方面。

  在cpu层面,进一步优化MESI协议,提高cpu利用率。他引入了一种叫做StoreBuffer的机制,这种优化机制会导致cpu的乱序执行。为了避免这个问题,cpu提供了内存屏障指令,上层应用程序可以在适当的位置插入内存屏障,以避免重新排序cpu指令的问题。编译过程中,在不改变单线程语义和程序正确性的前提下,对指令进行合理的重新排序,优化整体性能,所以共享变量增加了volatile关键字,所以编译器级别不会触发编译器的优化。同时,在jvm中,他会插入内存屏障指令来避免重排序问题。除了volatile关键字,它是从JDK5发展而来的。JMM用一个发生在之前的模型来描述一个多线程可见性的关系,即两个操作之间存在一个发生在之前的关系,所以这两个操作具有可见性的关系,不需要添加volatile关键字来提供可见性的保证。

  这就是这篇关于volatile关键字在Java中的作用的文章。有关Java中volatile关键字的更多信息,请搜索以前关于流行IT的文章或继续浏览下面的相关文章。我希望你以后能更多地支持流行音乐!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: