拜托,有谁能告诉我java中的volatile关键字是什么,它的主要功能,如何将它与synchronized块一起使用,如果我们从块中完全删除它会发生什么?
答案 0 :(得分:2)
让我们从java中的volatile变量开始:
Java中的Volatile用作Java编译器和Thread的指示符,它不缓存此变量的值并始终从主内存中读取
那么从内存中读取变量值有什么好处,请考虑以下示例代码:
public class Singleton{
private static volatile Singleton _instance; //volatile variable
public static Singleton getInstance(){
if(_instance == null){
synchronized(Singleton.class){
if(_instance == null)
_instance = new Singleton();
}
}
return _instance;
}
上一个示例中的:
1)我们只创建一次实例
2)我们在第一次请求时懒洋洋地创建实例。
如果我们不使_instance变量为volatile,则创建Singleton实例的Thread无法与其他线程通信,该实例已经创建,直到它出现在Singleton块中,因此如果Thread A正在创建Singleton实例并且在创建失去CPU之后,所有其他线程将无法看到_instance的值为非null并且他们将认为它仍为null。
结论:
volatile关键字会更有用。当多个线程使用相同的变量时,每个线程将拥有自己的该变量的本地缓存副本。因此,当它更新值时,它实际上在本地缓存中更新,而不是在主变量内存中更新。使用相同变量的另一个线程对另一个线程
更改的值一无所知
答案 1 :(得分:1)
Java中的Volatile用作Java编译器和Thread的指示符,它不缓存此变量的值并始终从主内存中读取它。