Java 单例模式之懒汉模式和饿汉模式 以及线程安全
Java 单例模式分 懒汉模式 和 饿汉模式
单例模式主要运用于频繁的调用不需要创建新的实例这种情况, 例如工具类,数据库操作类等。
单例模式需要将构造方法私有化,防止创建对象。
饿汉模式:
package tt; public class Singleton { private static Singleton sign = new Singleton(); private Singleton() { } public static Singleton getSign() { return sign; } }
饿汉模式初始化就创建了对象, 每次调用都返回同一个对象。
饿汉模式是线程安全的。
懒汉模式:
package tt; public class Singleton { private static Singleton sign = null; private Singleton() { } public static Singleton getSign() { if(null==sign){ sign =new Singleton(); } return sign; } }
与饿汉模式的区别是初始化不创建对象, 在使用的时候判断, 如果没有才创建。
这样在多线程的环境下会存在线程安全问题。 解决方法就是线程加锁
效率比较高的加锁方法:
package tt; public class Singleton { private static Singleton sign = null; private Singleton() { } public static Singleton getSign() { // 当前对象为null 的话才进入同步块 if (null == sign) { synchronized (Singleton.class) { if (null == sign) { sign = new Singleton(); } } } return sign; } }