0

拜托,谁能告诉我java中的volatile关键字是什么,它的主要功能,如何在同步块中使用它,如果我们将它从块中完全删除会发生什么?

4

2 回答 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 回答