1. 同步方法的初始化实例

package com.zhai.test;

public class SynchronizedSingleton {

    private static SynchronizedSingleton instance;

    /**
     * 私有化构造器, 其他类中无法使用MySingleton来产生对象
     */
    private SynchronizedSingleton() {
        // 初始化参数
    }

    /**
     * 使用同步的得到实例方法,防止多线程处理产生的问题
     *
     * 使用同步的话, 必须要等到其他的线程离开该方法才能进入这个方法,无法两个线程同时进入这个方法
     *
     * 换言来说, 同步降低了100倍的效率
     *
     * @return
     */
    public static synchronized SynchronizedSingleton getInstance() {
        if (instance == null) {
            instance = new SynchronizedSingleton();
        }
        return instance;
    }
}

 

2. 使用双重检查机制来避免多线程产生的问题

package com.zhai.test;

public class VolatileSingleton {

    /**
     * 使用双重检查加锁
     */
    private volatile static VolatileSingleton instance;

    /**
     * 私有化构造器, 其他类中无法使用MySingleton来产生对象
     */
    private VolatileSingleton() {
        // 初始化参数
    }

    /**
     * 使用同步的得到实例方法,防止多线程处理产生的问题
     *
     * 使用同步的话, 必须要等到其他的线程离开该方法才能进入这个方法,无法两个线程同时进入这个方法
     *
     * 换言来说, 同步降低了100倍的效率
     *
     * 双步检测是否产生实例,第一部如果没有实例 ,进入同步方法,进入同步方法后,再检测一次是否产生实例
     *
     * @return
     */
    public static synchronized VolatileSingleton getInstance() {
        if (instance == null) {
            synchronized (VolatileSingleton.class) {
                if (instance == null)
                    instance = new VolatileSingleton();
            }
        }
        return instance;
    }
}