Java单例设计模式的两种实现方式

分为两种:懒汉式和饿汉式

饿汉式:

package single;

/**
 * 单例设计模式:饿汉式
 * 
 * @author Administrator
 *
 */
public class Single {

    /** 
     * 初始化并且私有,静态,因为下面方法要返回生成的实例,
     * 但是只有静态才能调用静态资源,否则会报错。
     * 因此此处需要添加static修饰 
     * final:让new出来的实例锁住,防止线程安全问题
     */
    private static final Single SINGLE = new Single();

    /** 私有构造 */
    private Single(){}

    /**
     * 返回创建的实例对象
     *  
     * @return 实例对象
     */
    public static Single getInstance(){
        return SINGLE;
    }
}

懒汉式:

package single;

/**
 * 单例设计模式:懒汉式
 * 
 * @author Administrator
 *
 */
public class Single {

    /** 
     * 初始化实例对象
     * 此处不能添加finale修饰
     * 如果被修饰,那么single就不能被赋值
     */
    private static Single SINGLE = null;

    /** 私有构造方法 */
    private Single(){}

    /**
     * 返回创建的实例对象
     * 如果多个线程同时进来,并且同时卡到A点
     * 那么就不会达到单例,因此需要加synchronized
     * 
     * @return 创建的实例对象
     */
    public static synchronized Single getInstance(){

        if(SINGLE == null)
        // A点
        {
            return new Single();
        }

        return SINGLE;
    }
}

懒汉式优化(主要面试):

package single;

/**
 * 单例设计模式:懒汉式
 * 
 * @author Administrator
 *
 */
public class Single {

    /** 
     * 初始化实例对象
     * 此处不能添加finale修饰
     * 如果被修饰,那么single就不能被赋值
     */
    private static Single SINGLE = null;

    /** 私有构造方法 */
    private Single(){}

    /**
     * 返回创建的实例对象
     * 线程A拿到锁,到达C点 sleep了
     * 线程B进来了到达A点,有锁,进不去,
     * 线程A醒来之后,创建实例,返回
     * 线程C到达D点判断,进不去,直接返回
     * 线程D到达D点判断,进不去,直接返回
     * 。。。。
     * 
     * 
     * 这样就减少了判断锁的次数
     * 
     * 锁:因为程序都是静态实现,在调用方法的时候并没有this
     * 因此使用当前文件的.class文件
     * 
     * @return 实例对象
     */
    public static  Single getInstance(){

        // D点
        if(SINGLE == null)
        {
            // A点
            synchronized (Single.class) {
                // B点
                if(SINGLE==null){
                    // C点
                    return new Single();
                }
            }
        }

        return SINGLE;
    }
}

猜你喜欢

转载自blog.csdn.net/u013772906/article/details/78627774