什么是Volalite?
Volalite是为了解决共享变量写入后不能被其它线程读取的关键字,即当A线程修改了共享数据后,B线程可以及时拿到最新的值,解决不可见性问题
问题代码演示
/**
* @author LFDMW
* @date 2020-11-26 21:39
*/
public class VolatileTest implements Runnable{
private boolean flag = false;
@Override
public void run() {
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
flag = true;
System.out.println("flag为true啦");
}
public boolean show(){
return flag;
}
}
class Test{
public static void main(String[] args) {
VolatileTest vola = new VolatileTest();
new Thread(vola).start();
while (true){
if(vola.show()){
System.out.println("main方法xxxx");
break;
}
}
}
}
执行结果:
当该代码执行后,会发现我们main方法中的while循环会一直在死循环中,无法跳出,因为两个线程都在读取或写入同一个共享变量flag,那么我们在创建了VolatileTest这个对象后,这个flag会被存入到一块内存中,但我们的每个线程去操作flag的时候其实是将flag缓存到了cpu中,那么我们A线程去修改了flag值后,B线程拿不到新写入的值了,就会导致这个内存不可见性的一个问题
解决代码
private volatile boolean flag = false;
我们只需要给共享变量加上volatile关键字即可解决内存不可见性这个问题,当A线程修改完会同步到内存中,这样B线程在读取的时候也从内存中拿最新的值,不需要把变量缓存到cpu
好处
解决了内存不可见性,比synchronized具有更高的效率
坏处
不具备互斥性
不保证原子性
总结
volalite关键字是一个比synchronized更轻量级的同步机制,有着比加锁更快的执行效率但是不能当做锁来使用,因为它不具备互斥性。