单例模式几种实现

来源:互联网 发布:人工智能研究热点 编辑:程序博客网 时间:2024/05/17 22:07
  1. 饿汉模式
public class JDBCSingleton1 {    /**     * 构造函数私有,避免类在外部被实例化     */    private JDBCSingleton1(){    }    private static final JDBCSingleton1 jdbcSingleton = new JDBCSingleton1();  // 饿汉模式,线程安全    public static JDBCSingleton1 getJDBCSinleton(){        return jdbcSingleton;    }}
  1. 懒汉模式1–线程不安全
public class JDBCSingleton2 {    /**     * 构造函数私有,避免类在外部被实例化     */    private JDBCSingleton2(){    }    private static JDBCSingleton2 jdbcSingleton = null;  // 懒汉模式1,线程不安全    public static JDBCSingleton2 getJDBCSinleton(){        if(jdbcSingleton == null){            jdbcSingleton = new JDBCSingleton2();        }        return jdbcSingleton;    }}
  1. 懒汉模式2–加synchronized控制,线程安全,效率低
public class JDBCSingleton3 {    /**     * 构造函数私有,避免类在外部被实例化     */    private JDBCSingleton3(){    }    private static JDBCSingleton3 jdbcSingleton = null;  // 懒汉模式2,在方法上加syncronized,线程安全    public synchronized static JDBCSingleton3 getJDBCSinleton(){   // 每次都要同步,效率低        if(jdbcSingleton == null){            jdbcSingleton = new JDBCSingleton3();        }        return jdbcSingleton;    }}
  1. 懒汉模式3–双重检查锁定,线程安全,效率较高
public class JDBCSingleton4 {    /**     * 构造函数私有,避免类在外部被实例化     */    private JDBCSingleton4(){    }    private static JDBCSingleton4 jdbcSingleton = null;  // 懒汉模式3,双中检查锁定,线程安全    public  static JDBCSingleton4 getJDBCSinleton(){ // synchronized关键字不加在方法上,避免每次都要同步,显著提升性能        if(jdbcSingleton == null){              synchronized(JDBCSingleton4.class){                if(jdbcSingleton == null){                    jdbcSingleton = new JDBCSingleton4();                }            }        }        return jdbcSingleton;    }}
  1. 懒汉模式4–静态内部类,线程安全,效率最高
public class JDBCSingleton5 {    /**     * 构造函数私有,避免类在外部被实例化     */    private JDBCSingleton5(){    }    static class JDBCSingletonHolder {        private static JDBCSingleton5 jdbcSingleton = new JDBCSingleton5();  // 懒汉模式4,静态内部类,线程安全,利用classloader的机制来保证初始化instance时只有一个线程,效率最高,推荐使用    }    public  static JDBCSingleton5 getJDBCSinleton(){        return JDBCSingletonHolder.jdbcSingleton;    }}

结论&注意
1、推荐使用静态内部类创建单例
2、单例失效:通过Java反射机制是能够实例化构造方法为private的类的,使得Java单例实现失效

原创粉丝点击