• 《Java程序猿面试笔试宝典》之volatile有什么作用


    在由Java语言编写的程序中。有时候为了提高程序的执行效率,编译器会自己主动对其进行优化,把经常被訪问的变量缓存起来,程序在读取这个变量的时候有可能会直接从缓存(比如寄存器)中来读取这个值。而不会去内存中读取。这样做的一个优点是提高了程序的执行效率,但当遇到多线程编程时。变量的值可能由于别的线程而改变了,而该缓存的值不会相应改变,从而造成应用程序读取的值和实际的变量值不一致。比如,在本次线程内,当读取一个变量时,为提高存取速度,会先把变量读取到一个缓存中,当以后再取变量值时,就直接从缓存中取值。当变量值在本线程里改变时,会同一时候把变量的新值复制到该缓存中,以便保持一致。

           volatile是一个类型修饰符(typespecifier)。它是被设计用来修饰被不同线程訪问和改动的变量。被volatile类型定义的变量,系统每次用到它的时候都是直接从相应的内存其中提取,而不会利用缓存。在使用了volatile修饰成员变量后,全部线程在不论什么时候看到的变量的值都是同样的。以下给出一个使用volatile的演示样例。

    public class MyThread  implements  Runnable {

           private volatile Boolean flag;

           public void stop() {

                  flag = false;

           }

           public void run() {

                  while(flag)

                         ;//do something

           }

    }

           以上代码演示样例是用来停止线程最经常使用的一种方法。假设boolean类型的变量flag没有被声明为volatile,那么,当这个线程的run方法在推断flag值的时候,使用的有可能是缓存中的值,此时就不能及时地获取其他线程对flag所做的操作,因此会导致线程不能及时地停止。

           须要注意的是,由于volatile不能保证操作的原子性,因此,普通情况下volatile不能取代sychronized。此外,使用volatile会阻止编译器对代码的优化,因此会减少程序的执行效率。所以,除非迫不得已。否则。能不使用volatile。则尽量不要使用volatile。


    出自 新书《Java程序猿面试笔试宝典》官网

  • 相关阅读:
    大数据时代下的隐私保护(二)
    互联网+究竟想干什么
    MySql触发器使用解说
    系统函数C字符串的实现(12):strset
    參加湛江新教育群线下活动有感
    Axure多人协作
    hdu (1556 树状数组)
    [leetcode]Subsets II
    Oracle insert all语句介绍
    JQuery 实现锚点链接之间的平滑滚动
  • 原文地址:https://www.cnblogs.com/mfmdaoyou/p/6752965.html
Copyright © 2020-2023  润新知