时间都去哪儿了?
游戏玩得眼睛都花了
wang者峡谷一天天
转眼2018就要过完了……
再不努力我们就老了,没有时间用来浪费了。
不努力的人一定不酷,学java的你必学volatile。
volatile是Java 中的一个关键字。
Volatile的使用条件:
虽然volatile可以实现轻量级的同步机制,但是使用volatile修饰的变量必须满足以下两个条件:
对变量的写操作不依赖于当前值,或者确保只有一个线程修改变量的值;
该变量没有包含在具有其他变量的不变式中。
Volatile的三大特性:
1. volatile 变量具有 synchronized 的可见性特性,及如果一个字段被声明为volatile,java线程内存模型确保所有的线程看到这个变量的值是一致的。
锁提供了两种主要特性:互斥和可见性,互斥即一次只允许一个线程持有某个特定的锁,因此可使用该特性实现对共享数据的协调访问协议,这样,一次就只有一个线程能够使用该共享数据。可见性要更加复杂一些,它必须确保释放锁之前对共享数据做出的更改对于随后获得该锁的另一个线程是可见的。
2.禁止进行指令重排序
重排序通常是编译器或运行时环境为了优化程序性能而采取的对指令进行重新排序执行的一种手段。
重排序时,以volatile修饰属性的读、写操作代码行为分界线,读、写操作前面的代码不许排序到后面,后面同理不许排序到前面。由此bao证有序性。
3.不保证原子性
关于volatile实现的可见性可能会误解,认为既然volatile变量所有的写操作都会立刻反应到其它线程中,那么对volatile变量进行并发操作就是安全的。有这个误解是因为忽略了原子性,volatile是不bao证原子性的。对一个变量进行修改赋值操作,可能写的就是一条简单的i=i+1,但是底层实现上会需要多条字节码指令来完成,同时一条字节码指令也可能转化成多条机器码指令,在并发情况下,这些指令的执行不能bao证原子性。
Volatile的应用场景:
由于volatile bao证可见性和有序性,被volatile修饰的共享属性一般并发读/写没有问题,可看做是一种轻量级的synchronized实现。
再不努力我们就老了
没有拼搏怎么成长呢
诚筑说在这里等你呢
Java课程你值得拥有!