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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。