valitile
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了valitile相关的知识,希望对你有一定的参考价值。
valitile修饰的变量不允许线程内缓存以及重排序,它会直接修改主内存,每次使用前立即从主内存刷新,这样保证读到的都是最新的。但是只能保证变量的可见性,不能保证原子性(非原子操作不能保证线程安全),即存在线程安全问题
volatile 其本身包含“禁止指令重排序”的语义
synchronized 是由“一个变量在同一个时刻只允许一条线程对其进行 lock 操作”这条规则获得的,此规则决定了持有同一个对象锁的两个同步块只能串行执行;
Java语言提供了一种稍弱的同步机制,即volatile变量,用来确保将变量的更新操作通知到其他线程。当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的,因此不会将该变量上的操作与其他内存操作一起重排序。volatile变量不会被缓存在寄存器或者对其他处理器不可见的地方,因此在读取volatile类型的变量时总会返回最新写入的值。
在访问volatile变量时不会执行加锁操作,因此也就不会使执行线程阻塞,因此volatile变量是一种比sychronized关键字更轻量级的同步机制。
当对非 volatile 变量进行读写的时候,每个线程先从内存拷贝变量到CPU缓存中。如果计算机有多个CPU,每个线程可能在不同的CPU上被处理,这意味着每个线程可以拷贝到不同的 CPU cache 中。
而声明变量是 volatile 的,JVM 保证了每次读变量都从内存中读,跳过 CPU cache 这一步。
volatile 性能:
volatile 的读性能消耗与普通变量几乎相同,但是写操作稍慢,因为它需要在本地代码中插入许多内存屏障指令来保证处理器不发生乱序执行。
参考:http://www.cnblogs.com/zhengbin/p/5654805.html
以上是关于valitile的主要内容,如果未能解决你的问题,请参考以下文章