欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

设计模式---单例模式

程序员文章站 2024-03-23 14:29:22
...

单例模式定义

确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。

 

单例模式写法

单例模式分为饿汉模式懒汉模式

 

1.饿汉模式(静态常量)

/**
 * 饿汉模式(静态常量),即在类加载的时候就实例化
 */
public class SingletonPattern {

    private static SingletonPattern instance = new SingletonPattern();

    private SingletonPattern() {

    }

    public static SingletonPattern getInstance() {
        return instance;
    }

}

这种写法就是饿汉模式,在类加载的时候就进行单例对象的实例化,避免了同步问题。不过有一点不好的是,如果该单例对象没有被使用的话,就会造成内存浪费。

 

2.饿汉模式(静态代码段)

/**
 * 饿汉模式(静态代码块),即在类加载的时候就实例化
 */
public class SingletonPattern2 {

    private static SingletonPattern2 instance;

    static {
        instance = new SingletonPattern2();
    }

    private SingletonPattern2() {

    }

    public static SingletonPattern2 getInstance() {
        return instance;
    }

}

这个写法和上面大同小异,只不过是把单例对象的实例化放在静态代码段中,同样,这也是线程安全的。

 

3.懒汉模式(同步方法)

/**
 * 懒汉模式(同步方法)
 */
public class SingletonPattern3 {

    private static SingletonPattern3 instance;

    private SingletonPattern3() {

    }

    public static synchronized SingletonPattern3 getInstance() {
        if (instance == null) {
            instance = new SingletonPattern3();
        }
        return instance;
    }

}

这种写法就是通过同步方法实现的懒汉模式,虽然避免了同步问题,但是由于在方法上加了同步关键字,故效率会不理想。

 

4.懒汉模式(双重检查)

/**
 * 双重检查
 */
public class SingletonPattern4 {

    private static volatile SingletonPattern4 instance;

    private SingletonPattern4() {

    }

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

}

这种写法使用了双重检查的思想,单例对象instance要声明为volatile,这样在第二次检查instance是否为null的时候就能起到同步作用,所以该写法是线程安全的。

 

5.懒汉模式(静态内部类)

/**
 * 静态内部类方式
 */
public class SingletonPattern5 {

    private SingletonPattern5() {

    }

    private static class SingletonInstance {
        private static SingletonPattern5 instance = new SingletonPattern5();
    }

    public static SingletonPattern5 getInstance() {
        return SingletonInstance.instance;
    }

}

这种写法利用了jvm加载类机制的特点来保证单例对象只实例化一次,因为jvm在加载类和初始化的时候只有一个线程,这样就保证了线程安全。

 

相关标签: 设计模式