Volatile,JAVA5之后出现的多线程同步读锁属性修饰符。
让我们看一下一个单例的例子:
<!--<br /><br />Code highlighting produced by Actipro CodeHighlighter (freeware)<br />http://www.CodeHighlighter.com/<br /><br />-->
1
public
class
Singleton{
2 private static volatile Singleton _instance; // volatile variable
3
4 public static Singleton getInstance(){
5
6 if (_instance == null ){
7 synchronized (Singleton. class ){
8 if (_instance == null )
9 _instance = new Singleton();
10 }
11
12 }
13 return _instance;
14
15 }
16
17
18 Read more: http: // javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz3pfcVVsK1
19
很明显,我们可以得出两个结论
2 private static volatile Singleton _instance; // volatile variable
3
4 public static Singleton getInstance(){
5
6 if (_instance == null ){
7 synchronized (Singleton. class ){
8 if (_instance == null )
9 _instance = new Singleton();
10 }
11
12 }
13 return _instance;
14
15 }
16
17
18 Read more: http: // javarevisited.blogspot.com/2011/06/volatile-keyword-java-example-tutorial.html#ixzz3pfcVVsK1
19
1 instance只初始化一次
2 instance第一次初始化会比较慢
想想,如果我们不用 volatile ,会有什么结果。每个线程都会有一个线程变量区,彼此并不相通。当有A,B两个线程同时走到第6步,如果线程A得到锁,完成初始化instance之后,线程B同样进入第8步,这样其实是两个instance的。
通过加上volatle,线程B会把instance变量回写到主内存。如果其它线程进来,instance肯定就不是空值了