Java设计模式之单例模式

Java设计模式之单例模式

单例设计模式是对于某个类在整个系统中只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法并且是静态方法。解决了一个全局使用的类频繁地创建和销毁。

单列设计模式的七种方式

  • 饿汉式(静态常量,可能造成内存浪费)
  • 饿汉式(静态代码块,可能造成内存浪费)
  • 懒汉式(线程不安全)
  • 懒汉式(加入synchronized,线程安全,效率低)
  • 懒汉式(双重检查,加入synchronized,和volatile线程安全,同时保证效率,推荐使用)
  • 静态内部类(实现懒加载,线程安全,推荐使用)
  • 枚举类型

关键代码

  • 实现类的构造方法是private
  • 向外提供一个静态的公共方法

代码实现

饿汉式(静态常量,可能造成内存浪费)
/**
 * @author yly
 * @ClassName hungrySingleton 饿汉式(可能会造成内存浪费)
 * @Date 2020/2/8 15:45
 * @Version 1.0
 **/
public class HungrySingleton1 {

    private HungrySingleton1() {

    }
    /**
     * 本类内部创建对象实例
     */
    private final static HungrySingleton1 Instance = new HungrySingleton1();
    /**
     * 对外提供一个公有地静态方法
     * @return
     */
    public static HungrySingleton1 getInstance(){
        return Instance;
    }

}

优点:写法简单,类装载时完成实例化,避免线程同步问题
缺点:在类加载时完成实例化,如果系统没有使用此实例,造成内存浪费

饿汉式(静态代码块,可能造成内存浪费)

/**
 * @author yly
 * @ClassName HungrySingleton2 饿汉式(可能造成内存浪费)
 * @Date 2020/2/8 15:50
 * @Version 1.0
 **/
public class HungrySingleton2 {
    private HungrySingleton2() {

    }

    private final static HungrySingleton2 Instance;

    static {
        Instance = new HungrySingleton2();
    }

    public static HungrySingleton2 getInstance() {
        return Instance;
    }

}

懒汉式(线程不安全)

/**
 * @author yly
 * @ClassName idlerSingleton 懒汉式1(线程不安全,不建议使用)
 * @Date 2020/2/8 15:56
 * @Version 1.0
 **/
public class IdlerSingleton1 {
    private IdlerSingleton1() {
    }

    private static IdlerSingleton1 Instance;

    public static IdlerSingleton1 getInstance(){
        if (Instance==null){
            Instance = new IdlerSingleton1();
        }
        return Instance;
    }

}

优点:起到懒加载效果
缺点:只能在单线程下使用,在多线程下可能会产生多个实例,不推荐使用

懒汉式(加入synchronized,线程安全,效率低)

/**
 * @author yly
 * @ClassName IdlerSingleton2 懒汉式2 (加入synchronized,线程安全但是,效率太低,不推荐使用)
 * @Date 2020/2/8 15:59
 * @Version 1.0
 **/
public class IdlerSingleton2 {
    private IdlerSingleton2() {
    }
    private static IdlerSingleton2 Instance;

    public static synchronized IdlerSingleton2 getInstance(){
        if (Instance==null){
            Instance = new IdlerSingleton2();
        }
        return Instance;
    }
}

优点:解决线程安全问题
缺点:效率太低,不推荐使用

懒汉式(双重检查,加入synchronized,和volatile线程安全,同时保证效率,推荐使用)

/**
 * @author yly
 * @ClassName IdlerSingleton3 懒汉式3 双重检查(加入synchronized,和volatile线程安全,同时保证效率,推荐使用)
 * @Date 2020/2/8 16:04
 * @Version 1.0
 **/
public class IdlerSingleton3 {
    private IdlerSingleton3() {
    }

    private static volatile IdlerSingleton3 Instance;

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

优点:线程安全、延迟加载、效率高,推荐使用

静态内部类(实现懒加载,线程安全,推荐使用)

/**
 * @author yly
 * @ClassName StaticClassSingleton 静态内部类(实现懒加载,线程安全,推荐使用)
 * @Date 2020/2/8 16:56
 * @Version 1.0
 **/
public class StaticClassSingleton {
    private StaticClassSingleton() {
    }

    private static class SingletonInstance{
        private static final StaticClassSingleton Instance = new StaticClassSingleton();
    }

    public static StaticClassSingleton getInstance(){
        return SingletonInstance.Instance;
    }
}

  • 静态内部类采用类装载机制,保证初始化实例时只有一个线程,静态内部类在被装载时不会立即实例化,而在调用getInstance方法之后才会装载。
    优点:避免线程不安全,利用静态内部类特点实现延迟加载,效率高,推荐使用

枚举类型(推荐使用)

/**
 * @author yly
 * @ClassName EnumSingleton
 * @Date 2020/2/8 17:01
 * @Version 1.0
 **/
public enum  EnumSingleton {

    INSTANCE;

    public void EnumSingleton() {
    }
}

优点:通过枚举实现单例模式,避免多线程同步问题,而且防止反序列化重新创建新的对象,推荐使用。

单例模式在JDK中的应用java.lang.Runtime(饿汉式)

public class Runtime {
    private static Runtime currentRuntime = new Runtime();

    /**
     * Returns the runtime object associated with the current Java application.
     * Most of the methods of class <code>Runtime</code> are instance
     * methods and must be invoked with respect to the current runtime object.
     *
     * @return  the <code>Runtime</code> object associated with the current
     *          Java application.
     */
    public static Runtime getRuntime() {
        return currentRuntime;
    }

    /** Don't let anyone else instantiate this class */
    private Runtime() {}
}

总结:单例模式保证了系统内存中该类只存在一个对象,对于需要频繁创建和销毁的对象,使用单列模式可以提高系统的性能。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值