zoukankan      html  css  js  c++  java
  • Java基础面试题--单利模式及在多线程情况下的运用

    /**
     * 懒汉单利模式 线程不安全
     * @author 15735400536
     */
    public class Singleton {
    	
    	/**
    	 * 实例对象
    	 */
    	private static Singleton singleton;
    	
    	/**
    	 * 私有化构造函数,使外部不能创建对象
    	 */
    	private Singleton() {
    		
    	}
    	
    	/**
    	 * 获取实例方法
    	 * @return
    	 */
    	public static Singleton getInstance() {
    		if(null == singleton) {
    			singleton = new Singleton();
    		}
    		return singleton;
    	}
    	
    }
    

      解决方案:

    /**
      *     懒汉单例   线程安全
     * @author 15735400536
     *
     */
    public class IdlerSingleton {
    
    	/**
    	 * 实例对象
    	 */
    	private static IdlerSingleton idlerSingleton;
    	
    	/**
    	 * 私有化构造函数
    	 */
    	private IdlerSingleton() {
    		
    	}
    	
    	/**
    	 * 加了synchronized关键字
    	 * @return
    	 */
    	public static synchronized IdlerSingleton getInstance() {
    		if(null == idlerSingleton) {
    			idlerSingleton = new IdlerSingleton();
    		}
    		return idlerSingleton;
    	}
    	
    	//或者添加同步代码块:
    //	public static IdlerSingleton getNewInstance() {
    //		if(null == idlerSingleton) {
    //			synchronized (IdlerSingleton.class) {
    //				idlerSingleton = new IdlerSingleton();
    //			}
    //		}
    //		return idlerSingleton;
    //	}
    }
    

      

    /**
     * 双重检查单利模式  解决懒汉单利在多线程情况下发生不安全问题解决方案
     * @author 15735400536
     *
     */
    public class DoubleCheckSingleton {
        
        //volatile 禁止重排序
        private static volatile DoubleCheckSingleton doubleCheckSingleton;
        
        private DoubleCheckSingleton() {}
        
        public static DoubleCheckSingleton getInstance() {
            if(null == doubleCheckSingleton) {
                synchronized (DoubleCheckSingleton.class) {
                    if(null == doubleCheckSingleton) {
                        doubleCheckSingleton = new DoubleCheckSingleton();
                    }
                }
            }
            return doubleCheckSingleton;
        }
        
    }
    /**
     * 饿汉单例 线程安全
     * @author 15735400536
     *
     */
    public class HungrySingleton {
    
    	/**
    	 * 静态代码块
    	 */
    	static {
    		hungrySingleton = new HungrySingleton();
    	}
    	
    	private static HungrySingleton hungrySingleton;
    	
    	private HungrySingleton() {}
    	
    	public static HungrySingleton getInstance() {
    		return hungrySingleton;
    	}
    }
    

      

    /**
     * 饿汉单利  线程安全
     * @author 15735400536
     *
     */
    public class NewHungrySingleton {
    	
    	/**
    	 * 静态常量实例对象
    	 */
    	private final static NewHungrySingleton newHungrySingleton = new NewHungrySingleton();
    	
    	private NewHungrySingleton() {}
    	
    	/**
    	 * 饿汉 NewHungrySingleton类加载时,实例对象就已经创建好了
    	 * @return
    	 */
    	public static NewHungrySingleton getInstance() {
    		return newHungrySingleton;
    	}
    	
    }
    

      

    推荐阅读: https://www.cnblogs.com/xz816111/p/8470048.html

  • 相关阅读:
    char *s 和char s[]的区别
    Loadrunner时间函数、用时间生成订单编号例子
    loadrunner获取毫秒及字符串替换实现
    关联的特殊应用
    LR中的时间戳函数web_save_timestamp_param
    使用 If-Then-Else 逻辑进行分支
    ArcGIS中国工具3.2新功能
    运行模型,COM错误,解决问题步骤
    arcgis python 更新日期为随机数
    使用LAS数据集创建DEM和DSM
  • 原文地址:https://www.cnblogs.com/mxh-java/p/11041627.html
Copyright © 2011-2022 走看看