java设计模式-单例模式

来源:互联网 发布:泸州古蔺网络问政平台 编辑:程序博客网 时间:2024/06/05 07:04

单例模式:

单例模式(Singleton Pattern):确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例,这个类称为单例类,它提供全局访问的方法。单例模式是一种对象创建型模式。
单例模式有三个要点:一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行向整个系统提供这个实例。
单例模式是结构最简单的设计模式一,在它的核心结构中只包含一个被称为单例类的特殊类。

懒汉式(线程不一定安全)

  • 为什么说线程不一定安全?在高并发情况下不能保证数据一致,线程安全的在下面讲
  • (1)由于每次使用new关键字来实例化Singleton 类时都将产生一个新对象,为了确保Singleton 实例的唯一性,我们需要禁止类的外部直接使用new来创建对象,因此需要将Singleton 的构造函数的可见性为private
  • (2)将构造函数改为private修饰后该如何创建对象呢?不要着急,虽然类的外部无法再使用new来创建对象,但是在Singleton 的内部还是可以创建的,可见性只对类外有效。因此,我们可以在Singleton 中创建并保存这个唯一实例。为了让外界可以访问这个唯一实例,需要在Singleton类 中定义一个静态的Singleton 类型的私有成员变量
  • (3)为了保证成员变量的封装性,我们将Singleton 类型的single的可见性设置为private,但外界该如何使用该成员变量并何时实例化该成员变量呢?答案是增加一个公有的静态方法Singleton getInstance(),
//懒汉式单例类.在第一次调用的时候实例化自己   public class Singleton {      //1 私有的构造器    private Singleton() {}      //2 私有 静态 Singleton类型 成员变量    private static Singleton single=null;      //3 公有静态方法      public static Singleton getInstance() {           if (single == null) {                 single = new Singleton();           }            return single;      }  }

饿汉式(线程不一定安全)

  • 不管有么有被被人使用,先把对象创建出来
//饿汉式单例类.在类初始化时,已经自行实例化   public class Singleton1 {      //1 私有构造器    private Singleton1() {}     //2 直接创建私有 静态(可以不是final)对象    private static final Singleton1 single = new Singleton1();      //3 静态方法       public static Singleton1 getInstance() {          return single;      }  }  

懒汉式(线程安全的)

  • 线程安全常用方法是加锁.这里使用同步锁机制(synchronized )
  • 把锁加在方法上
public class Singleton {      //1 私有的构造器    private Singleton() {}      //2 私有 静态 Singleton类型 成员变量    private static Singleton single=null;      //3 公有静态方法  (加入同步锁)    public static synchronized Singleton getInstance() {           if (single == null) {                 single = new Singleton();           }            return single;      }  }

什么是线程安全

  • 如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。
    或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。