1-5 单例模式

来源:互联网 发布:java redis队列使用 编辑:程序博客网 时间:2024/06/08 16:47

单例模式

    • 单例模式
      • 写在前边的话
      • 定义
      • 单线程下的单例模式
      • 多线程下的单例模式
        • 同步getInstance方法
        • 双重检查加锁
        • 急切实例化

写在前边的话

单例模式是一个比较简单的小模式,常用它来管理共享的资源:线程池、缓存、对话框、处理偏好设置、注册表的的对象

定义

确保一个类只有一个实例,并提供一个全局访问点。

单线程下的单例模式

public class Singleton {    private static Singleton singleton ;    //构造器对外隐藏    当然也可以有带参的私有构造器    private Singleton(){}    //外部代码通过Singleton.getInstance();就可以获得唯一的实例    public static Singleton getInstance(){        if (singleton == null) {            singleton = new Singleton();        }        return singleton;}

多线程下的单例模式

多线程时,下边的实例判断就会有问题

if (singleton == null) {    singleton = new Singleton();}

可如下三种方式处理

同步getInstance()方法

public class Singleton {    private static Singleton singleton ;    private Singleton(){}    //synchronize  弊端: 1 加同步,同步一个方法可能造成程序效率下降100倍 2 如果该实例已存在也会同步,这事没必要的    public static synchronize Singleton getInstance(){        if (singleton == null) {            singleton = new Singleton();        }        return singleton;}

双重检查加锁

public class Singleton {    private static Singleton singleton ;    private Singleton(){}    public static Singleton getInstance(){        if (singleton == null) {// 判断有无必要加锁            synchronized (Singleton.class) {                if (singleton == null) {// 这段时间是否已经被实例化                    singleton = new Singleton();                }            }        }        return singleton;    }}

急切实例化

依赖JVM在加载这个类时马上创建唯一的实例。最好是 能这个实例一定被用到,不然 在加载时就初始化就浪费了

public class Singleton {    private static Singleton singleton = new Singleton();    private Singleton(){}    public static Singleton getInstance(){        return singleton;    }}
原创粉丝点击