最轻量的同步机制
获取被volatile修饰的变量的时候,每次都要从主内存中获取
设置被volatile修饰的变量的时候,每次都要刷回主内存当中
当其他线程调用的时候,会将自己线程当中保存的变量值置为无效,然后重新重主内存获取
在读取和写入到主内存的时候,不会进行加锁,所以称之为最轻量的同步机制
volatile不是线程安全的,他只能保证变量的可见性,无法保证其原子性,如果设置的时候采用运算方式,那么将无法保证线程安全
运算方式
public volatile int age = 200;
set age = age+20; // 无法保证操作的原子性
这就是运算赋值(简写)
测试用例:
package org.dance.day1.vola;
import org.dance.tools.SleepTools;
/**
* volatile无法保证操作的原子性
* @author ZYGisComputer
*/
public class VolatileUnsafe {
private static class VolatileVar implements Runnable{
private volatile int a = 0;
@Override
public void run() {
String name = Thread.currentThread().getName();
a = a + 1;
System.out.println(name + ":" + a);
SleepTools.ms(100);
a = a + 1;
System.out.println(name + ":" + a);
}
}
public static void main(String[] args) {
VolatileVar volatileVar = new VolatileVar();
Thread thread = new Thread(volatileVar);
Thread thread1 = new Thread(volatileVar);
Thread thread2 = new Thread(volatileVar);
Thread thread3 = new Thread(volatileVar);
thread.start();
thread1.start();
thread2.start();
thread3.start();
}
}
返回测试结果:
Thread-0:1
Thread-3:4
Thread-2:3
Thread-1:2
Thread-0:5
Thread-1:7
Thread-2:6
Thread-3:5
可以看见volatile无法保证操作的原子性
所以说volatile关键字适用于一个线程写,多个线程读的场景,因为他只能保证可见性,不能保证原子性