001package net.gdface.utils;
002
003/**
004 * 基于volatile的双重检查锁定实现{@link ILazyInitVariable}的抽象类<br>
005 * 原理说明参见<a href="http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html">《The "Double-Checked Locking is Broken" Declaration》</a><br>
006 * 要求 JDK5 以上版本 
007 * @author guyadong
008 *
009 * @param <T> variable type
010 */
011public abstract class BaseVolatile<T> extends ILazyInitVariable.BaseLazyVar<T>{
012        private volatile T var = null;
013        public BaseVolatile() {
014        }
015        @Override
016        public T get() {
017                // Double-checked locking
018                if(null == var){
019                        synchronized(this){
020                                if(null == var){
021                                        var = doGet();
022                                }
023                        }
024                }
025                return var;
026        }
027}