volatile同步java块的volatile关键字的重要性是什么?

时间:2013-04-20 11:04:53

标签: java synchronization

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

2 个答案:

答案 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的指示符,它不缓存此变量的值并始终从主内存中读取它。

What will happen if we remove it from a synchronized block?