Java单例模式

来源:互联网 发布:免费网页数据采集器 编辑:程序博客网 时间:2024/06/18 16:19

什么是单例模式

       单例模式有以下特点:
  1、只能有一个实例。
  2、必须内部创建自己的唯一实例。

  3、必须给所有其他对象提供同一个实例。

三个方式

      1.饿汉式(推荐使用,Java源码中的的Runtime类就用的这种方式)
/** * 单例模式---饿汉式 * @author Administrator * */public class Singleton {//静态的对象实例private static Singleton instance = new Singleton();//私有的构造方法,防止外部通过new创建对象private Singleton(){}//返回对象实例public static Singleton getInstance(){return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1==s2);}}
        2.懒汉式
/** * 单例模式---- 懒汉式 * @author Administrator * */public class Singleton {// 静态的对象实例private static Singleton instance = null;// 私有的构造方法,防止外部通过new创建对象private Singleton(){}public static Singleton getInstance() {if(instance == null){instance = new Singleton();}return instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);}}
          这个方式有个问题,它适合单线程环境,再多线程环境下会有线程安全问题。
          改进方式1:
public synchronized static Singleton getInstance() {if(instance == null){instance = new Singleton();}return instance;}
         在获取实例的静态方法上加锁,可以避免线程安全问题,但加上同步锁后,性能上有损耗,不建议使用这种方式。
         改进方式2:
public static Singleton getInstance(){      if(instance==null){          synchronized(Singleton.class){         if(instance==null){                     instance=new Singleton();                }          }      }     return instance;}
           这种方式加同步锁时,前后两次判断实例是否存在,减少了创建锁的次数,但代码也复杂,比上一个好一些,可行。
        3.静态内部类(建议使用)
public class Singleton {private Singleton() {}private static class SingletonHolder {private final static Singleton instance = new Singleton();}public static Singleton getInstance() {return SingletonHolder.instance;}public static void main(String[] args) {Singleton s1 = Singleton.getInstance();Singleton s2 = Singleton.getInstance();System.out.println(s1 == s2);}}
        这种方式既实现了线程安全,又避免了同步带来的性能影响。
为什么要用单例模式第一、控制资源的使用,通过线程同步来控制资源的并发访问;第二、控制实例产生的数量,达到节约资源的目的。第三、作为通信媒介使用,也就是数据共享,它可以在不建立直接关联的条件下,让多个不相关的两个线程或者进程之间实现通信。


         

原创粉丝点击