对java软件开发有一定了解的小伙伴,那么对其相关的关键字应该也不陌生,volatile一定是配拥有名字的关键字,下面就跟小编一起来看看volatile的可见性是指什么,以及volatile是如何实现的?
其实可见性就是,在多线程环境中,对共享变量的修改对于其他线程是否立即可见的问题。例如:
子线程,1s之后,将flag修改为true;
public class TestVolatile extends Thread
{
boolean flag = false;
@Override
public void run()
{
try
{
Thread.sleep(1000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
flag = true;
System.out.println("flag:" + isFlag());
}
public boolean isFlag()
{
return flag;
}
}主线程,不断判断flag的值,如果被修改,则打印并终止;
public class Main
{
public static void main(String[] args) throws InterruptedException
{
TestVolatile thread = new TestVolatile();
thread.start();
while (true)
{
if (thread.isFlag())
{
System.out.println("flag被改了");
break;
}
}
}
}如果说一切正常的话,1s后,主线程将会打印"flag被改了",但是其实真实情况确是子线程真的把flag改了,但是主线程一直没有感知到flag的变化,进入了死循环。这就是没有满足可见性所带来的问题。
至于为什么volatile能保证可见性,我们可以从其规则可窥一二:修改了volatile变量,就必须立即同步到主存,同时可以使其他线程工作内存中的值变为无效;在使用volatile变量前,必须先从主存刷新,以此来保证其可见性
同样以上面的代码为例:子线程将flag修改为true,同步到主存,同时使主线程的工作内存中的flag失效,主线程下次使用flag时if (thread.isFlag()),发现工作内存中的flag已经失效,而且由于volatile的影响,在使用flag前本来也会强制从主存刷新,将会得到最新的值true。可以看得出来volatile对于单纯的set/get场景是非常好用的。
那么以上就是有关volatile可见性的所有内容了,如果还想了解更多java一些知识问答,记得关注本站消息哦。