拜托,谁能告诉我java中的volatile关键字是什么,它的主要功能,如何在同步块中使用它,如果我们将它从块中完全删除会发生什么?
问问题
1090 次
2 回答
2
让我们从 java 中的 volatile 变量开始:
Java 中的 Volatile 关键字用作 Java 编译器和线程的指示符,它们不缓存此变量的值并始终从主内存中读取它
那么从内存中读取变量值有什么好处,请考虑以下示例代码:
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 实例的线程无法与其他线程通信,该实例已创建,直到它从 Singleton 块中出来,所以如果线程 A 正在创建 Singleton 实例并且刚刚创建失去了 CPU,所有其他线程将无法看到 _instance 的值不为空,他们会相信它仍然为空。
结论:
volatile 关键字会更有用。当多个线程使用同一个变量时,每个线程都会为该变量拥有自己的本地缓存副本。因此,当它更新值时,它实际上是在本地缓存中更新,而不是在主变量内存中。使用相同变量的另一个线程对另一个线程更改的值一无所知
于 2013-04-20T11:13:40.593 回答
1
Java 中的 Volatile 关键字用作 Java 编译器和线程的指示符,它们不缓存此变量的值并始终从主内存中读取它。
于 2013-04-20T11:06:50.507 回答