java中关键字volatile有什么作用,volatile有什么含义,并给出例子

  java中关键字volatile有什么作用,volatile有什么含义,并给出例子

  如何解决写爬虫IP受阻的问题?立即使用。

  本教程运行环境:windows7系统,java10版本10,DELL G3电脑。这个方法适用于所有品牌的电脑。

  相关免费学习推荐:java基础教程

  java中volatile的作用:

  1、可见性:Java提供了volatile关键字来保证可见性。

  当一个共享变量用volatile修饰时,它将确保修改后的值会立即更新到主存中。当其他线程需要读取它时,它会到内存中读取新值。

  但是不能保证公共共享变量的可见性,因为公共共享变量被修改后何时写入主存是不确定的。当其他线程读取它们时,此时内存可能仍然具有原来的旧值,因此无法保证可见性。

  此外,还可以通过synchronized和Lock来确保可见性,synchronized和Lock可以确保只有一个线程获得锁,然后同时执行同步代码,并在释放锁之前将变量的变化刷新到主存中。从而可以确保可见度。

  先看一段代码。如果线程1先执行,线程2后执行:

  //线程1

  布尔停止=假;

  而(!停止){

  do something();

  }

  //线程2

  stop=true这段代码是典型的代码,很多人在中断线程时可能会使用这种标记方法。但实际上这段代码会正确运行吗?线程会被中断吗?不会,可能大部分时候,这段代码可以中断线程,但也可能导致无法中断线程(虽然这种可能性很小,但一旦出现这种情况,就会造成无限循环)。

  我们来解释一下为什么这段代码可能会导致线程中断失败。如前所述,每个线程在运行时都有自己的工作内存,因此当线程1运行时,它会复制stop变量的值,并将其放入自己的工作内存中。

  然后,当线程2改变了stop变量的值,但在它可以写入主存之前,线程2继续做其他事情,所以线程1会继续循环,因为它不知道线程2对stop变量的改变。

  但是在用挥发物装饰之后,它就变得不同了:

  首先,使用volatile关键字将强制修改后的值立即写入主存;

  其次,如果使用volatile关键字,修改线程2时,线程1的工作内存中缓存变量stop的缓存线将无效(如果反映到硬件层,则CPU的L1或L2缓存中对应的缓存线无效);

  第三,由于变量stop在线程1工作内存中的缓存行无效,线程1再次读取变量stop的值时会去主存读取。

  那么,当线程2修改stop值时(这里当然包括两个操作,修改线程2工作内存中的值,然后将修改后的值写入内存中),线程1工作内存中的缓存变量stop的缓存线就会失效。然后,当线程1读取时,它发现自己的缓存行无效。它会等待缓存行对应的主存地址更新,然后到对应的主存读取最新值。

  然后线程1读取最新的正确值。

  2、保证有序性

  volatile boolean inited=false

  //线程1:

  context=load context();

  inited=true

  //线程2:

  而(!inited ){

  睡眠()

  }

  doSomethingwithconfig(上下文);确保上下文已经初始化。

  3、double check

  类Singleton{

  private volatile static Singleton实例=null

  私有Singleton() {

  }

  公共静态Singleton getInstance() {

  if(instance==null) {

  synchronized (Singleton.class) {

  if(instance==null)

  instance=new Singleton();

  }

  }

  返回实例;

  }

  }以上是volatile在java中的作用是什么的详细内容。更多请关注我们的其他相关文章!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: