码迷,mamicode.com
首页 > 其他好文 > 详细

单例模式的几种写法

时间:2016-09-23 11:12:29      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:

懒汉式 饿汉式就不多说了 体会代码  都不能防止反射机制攻击和反序列化 

public class Singleton {
    private static final Singleton MYINSTANCE = new Singleton();

    private Singleton() {
        super();
    }

    public static Singleton getInstance() {
        return MYINSTANCE; }
}
/* * 饿汉式单例模式 线程安全 但是不能防止反射攻击 序列化会重新创建一个对象 */
public class Singleton2 {
    public static final Singleton2 MYINSTANCE= new Singleton2();

    private Singleton2() {
        super();
    }

}
/*
 * 饿汉式单例模式第二种写法 
 */
public class Singleton3 {
    private static Singleton3 mySinglenton;

    private Singleton3() {
        super();
    };

    public synchronized static Singleton3 getInstance() {
        return mySinglenton == null ? new Singleton3() : mySinglenton;
    }
}
/*
 * 懒汉单例模式 没有对象才造一个 
* 不能防止java的反射攻击 java反射机制可以构造私有化的构造方法 线程不安全 可能存在两个以上线程同时判断引用为空 * 可以加锁解决
*/

还有《高效java编程》中写的枚举式单例模式  线程安全 还能防止反射攻击 对应的开销也会加大 

体会代码

public enum Singleton4 {
    INSTANCE;
    public Singleton4 getInstance() {
        return INSTANCE;
    }
}

还有种注册登记机制 用的还是饿汉式 只是构建了一个map map里没有写入map一个实例 适合大量单例模式

综上一般写饿汉式肯定没问题 需要序列化对象时再用枚举式的  以上 

单例模式的几种写法

标签:

原文地址:http://www.cnblogs.com/hellew/p/5899106.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!