设计模式#单例的多种演变

1、存在线程访问问题的单例

/**  
 * 实现单例访问Kerrigan的第一次尝试  
 */  
public class SingletonKerriganA {   
    
    /**  
     * 单例对象实例  
     */  
    private static SingletonKerriganA instance = null;   
    
    public static SingletonKerriganA getInstance() {   
        if (instance == null) {                              //line A   
            instance = new SingletonKerriganA();          //line B   
        }   
        return instance;   
    }   
}  

线程在某个程序片之间交叉访问时对同一个对象并作修改,谁是谁?这一点难以判定。

2、没有线程访问问题但付出代价很大的单例<同步会占用资源,使程序陷入等待>

/**  
 * 实现单例访问Kerrigan的第二次尝试  
 */  
public class SingletonKerriganB {   
    
    /**  
     * 单例对象实例  
     */  
    private static SingletonKerriganB instance = null;   
    
    public synchronized static SingletonKerriganB getInstance() {   
        if (instance == null) {   
            instance = new SingletonKerriganB();   
        }   
        return instance;   
    }   
}  

3、比较实用的单例

/**  
 * 能应对大多数情况的单例实现  
 */  
public class SingletonKerrigan implements Serializable {   
    
    private static class SingletonHolder {   
        /**  
         * 单例对象实例  
         */  
        static final SingletonKerrigan INSTANCE = new SingletonKerrigan();   
    }   
    
    public static SingletonKerrigan getInstance() {   
        return SingletonHolder.INSTANCE;   
    }   
    
    /**  
     * private的构造函数用于避免外界直接使用new来实例化对象  
     */  
    private SingletonKerrigan() {   
    }   
    
    /**  
     * readResolve方法应对单例对象被序列化时候  
     */  
    private Object readResolve() {   
        return getInstance();   
    }   
}  

你可能感兴趣的:(designpattern)