Java设计模式之单例模式

单例模式:确保一个类最多只有一个实例,并提供一个全局访问点

特点:
- 单例类只能有一个实例
- 单例类必须自己创建自己的唯一实例
- 单例类必须给所有其他对象提供这一实例

适用场景:
(1)Windows的任务管理器和回收站就是很典型的单例模式,都只有一个实例。
(2)网站的计数器,一般也是采用单例模式实现,否则难以同步。
(3)应用程序的日志应用,一般都何用单例模式实现,这一般是由于共享的日志文件一直处于打开状态,因为只能有一个实例去操作,否则内容不好追加。
(4)多线程的线程池的设计一般也是采用单例模式,这是由于线程池要方便对池中的线程进行控制。
(5)Web应用的配置对象的读取,一般也应用单例模式,这个是由于配置文件是共享的资源

一.经典单例模式

饿汉式单例:

public class Singleton {
    private static Singleton singleton = new Singleton();

    private Singleton() {
    }

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

懒汉式单例:

public class Singleton {
    private Singleton() {
    }

    private static Singleton singleton = null;

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

二.多线程情况下的优化

在多线程情况下,应避免不同线程发送意外导致获取到不同的实例

1.饿汉式单例

就是上面所讲的饿汉式,急切的创建该单例,也就是不管是否需要这个单例,都给他创建出来,这样有可能会浪费一些内存。

2.单一同步锁

使得getInstance()方法只有当当前一个线程执行完后,其他线程才能执行它,避免创建多个实例,保证了线程安全。但是同步锁消耗资源比较多,不适用于频繁的调用getInstance()。

public class Singleton {
    private static Singleton singleton;

    private Singleton() {
    }
                  /*加同步锁*/
    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
}

3.双重同步锁

能够更好地保证线程安全,比同步锁更节省资源,在创建一个singleton之后,singleton不再等于null,就不会再次使用同步锁,所以即使频繁调用getInstance()也没有问题了。

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;
    }
}

你可能感兴趣的:(java,单例模式,java设计模式)