长话短说-Java中的volatile(面试常见)

volatile,是Java提供的一种轻量级的同步机制,在并发编程中可以发挥一定作用,相对于sync的开销来讲要小的多;

volatile具备两个特性:

特性1.保证共享变量对所有线程的可见性; 

     可见性:指当一个线程修改了共享变量的值,新值对于其他线程来说都是立即有感知的。

      补充:Java内存模型(JMM) jmm决定了一个线程对共享变量的写入何时对其他线程可见,jmm定义了线程和主内存之间的抽象关系,共享内存存储在主内存中,而每个线程由都有一个私有本地内存,本地内存保存了该线程所使用到的主内存的拷贝副本,线程对变量的操作都必须是在工作内存中进行 而不能直接修改主内存的变量。(本地私有内存、主内存皆为抽象概念 方便大家了解)

    被volatile修饰的变量会是这样:1> 当修改它时, jmm会把该线程对应的本地内存中修改的变量值  强制刷新到主内存中;

        2> 这个写操作 还会导致其他线程中的缓存的变量副本 无效。

     这样 是不是就保证了 这个变量的可见性啦~

特性2.禁止指令重排序

     重排序是指编译器和处理器为了优化程序性能而对指令进行排序的手段,它有规则:

      1> 重排序不会对存在数据依赖关系的操作进行重排序(如:a=1;b=a; 这个指令序列,由于第二个操作依赖于第一个操作,所以在编译时和处理器运行时这两个操作不会被重排序。)

        2>重排序是为了优化性能 但是不管怎么排序 单线程下程序的执行结果不能被改变.


参考连接:http://www.cnblogs.com/chengxiao/p/6528109.html

猜你喜欢

转载自blog.csdn.net/q18810146167/article/details/79619767
今日推荐