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

来源:互联网 发布:2016年网络作家排行榜 编辑:程序博客网 时间:2024/05/22 08:06

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

饿汉式:

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;    }}
原创粉丝点击