java设计模式之单例模式

   单列模式可以说是java设计模式中最常见的一种了,下面来聊下我对这个设计模式的一些认识吧

一、单例模式的定义  “

  Java中单例模式的定义是:“一个类有且仅有一个实例,并且自行实例化向整个系统提供”。,具体说来就是一下3点。1、单例类只能有一个实例。2、单例类必须自己创建自己的唯一实例。3、单例类必须给所有其他对象提供这一实例。

二、单例模式的优缺点

优点:(1) 由于单例模式在内存中只有一个实例,减少内存开支,特别是一个对象需要频繁地创建销毁时,而且创建或销毁时性能又无法优化,单例模式就非常明显了

   (2) 单例模式可以避免对资源的多重占用,例如一个写文件操作,由于只有一个实例存在内存中,避免对同一个资源文件的同时写操作

   (3)单例模式可以在系统设置全局的访问点,优化和共享资源访问,例如,可以设计一个单例类,负责所有数据表的映射处理。

缺点:(1) 单例模式一般没有接口,扩展很困难,若要扩展,除了修改代码基本上没有第二种途径可以实现。

三、单例模式的应用场景

(1).资源共享的情况下,避免由于资源操作时导致的性能或损耗等。如上述中的日志文件,应用配置。 
(2).控制资源的情况下,方便资源之间的互相通信。如线程池等。 

四,单例模式的实现

主要分两种,恶汉和懒汉,具体实现起来也有各种不同的方式

恶汉,采用静态常量的方式(也可使用静态块的方式),实现简单,类装载时就将对象实例化了,避免了同步时的风险,但如该对象未被使用,浪费了内存

public class Singleton {

    private final static Singleton INSTANCE = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return INSTANCE;
    }
}

懒汉,在第一次使用该类的时候创建对象,但是存在同步问题,导致创建多个实例

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

 

懒汉,避免了上一种方式带来的同步问题,但是加锁的同时也让效率变得很低

public class Singleton {

    private static Singleton singleton;

    private Singleton() {}

    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

 懒汉,双重检查,同样解决了同步问题,但是加锁的位置不同,效率较高,只会在初始化时面临同步竞争锁的情况

public class Singleton {

    private static volatile Singleton singleton;

    private Singleton() {}

    public static Singleton getInstance() {
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
}

 

posted @ 2018-12-24 00:00  yao_1  阅读(126)  评论(0编辑  收藏  举报