大家好,又见面了,我是你们的朋友全栈君。
voliate
voliate定义
java编程语言允许线程访问共享变量,为了确保共享变量能被准确和一致的更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁更加方便。如果一个字段被声明成volatile,java线程内存模型确保所有线程看到这个变量的值是一致的。volatile可以保证线程可见性且提供了一定的有序性,但是无法保证原子性。在JVM底层volatile是采用“内存屏障”来实现的。
即一旦一个共享变量(类的成员变量、类的静态成员变量)被volatile修饰之后,那么就具备了两层语义:
(1)保证了不同线程对这个变量进行操作时的可见性,即一个线程修改了某个变量的值,这新值对其他线程来说是立即可见的。保证可见性、不保证原子性。
(2)禁止进行指令重排序
使用volatile关键字的场景
一般使用voliate必须具备如下条件:
(1)对变量的写操作不依赖于当前值
(2)变量中没有包含影响外部的其他变量
第一种就是适合单例模式来修饰单例对象
public class Signle {
private static volatile Signle SIGNLE;
private Signle() {
}
public static Signle getInstance0() {
return SingleLazy.SIGNLE;
}
public static Signle getInstance() {
if (null == SIGNLE) {
synchronized (Signle.class) {
if (null == SIGNLE) {
SIGNLE = new Signle();
}
}
}
return SIGNLE;
}
第二种情况就是该变量是全局的属性,如果变化,会导致全局所有的线程都作出相应的操作。
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/135411.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...