首页 > 代码库 > volatile--共享数据必须保证可见性
volatile--共享数据必须保证可见性
在Effective Java中看到的,试了一下,有点意思,考查的知识点是volatile关键字。
下面这段代码,预期是打印it takes xxxx miliseconds. 。但实际上,陷入了死循环。
1 public class ThreadNeverStop { 2 3 private static boolean stopRequested; 4 5 public static void main(String[] args) throws InterruptedException { 6 Thread backgroundThread = new Thread(new Runnable() { 7 8 @Override 9 public void run() {10 long start = System.currentTimeMillis();11 while (!stopRequested) {12 //whatever13 }14 long end = System.currentTimeMillis();15 System.out.println("it takes " + (end - start) + " miliseconds.");16 }17 });18 19 backgroundThread.start();20 21 Thread.sleep(1000L);22 23 stopRequested = true;24 }25 }
学习过Java内存模型就会知道,这是因为stopRequested这个域,在主线程和backgroundThread中各有备份。当主线程执行完毕,将新值刷到主内存中,backgroundThread并没有从主内存获取最新的值,导致一直判断为false.
最直接的方法是使用同步,但还有更简洁,轻量的方法,那就是使用volatile。volatile关键字修改的共享变量,线程在访问时,会向主内存获取最新的值。
之前一直认为【如果不需要原子性,对于共享变量可以不用volatile,反正线程执行完一定会刷新到主内存】,忘记了可能另外的线程同时甚至更早已经获取了共享变量的值,没有继续从主内存中获取最新的值。为了确保共享变量修改后,可以知会到其他线程,并且其他线程在使用到共享变量时能够主动向主内存获取最新值,应该要使用volatile。
volatile--共享数据必须保证可见性
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。