简述设计模式(一)——单例模式

单例模式

单例模式,保证整个软件系统中,对某个类只能创建一个对象实例,并且该类只提供一个取得其对象实例的方法。

单例模式的实现方式有:

  1. 立即加载(饿汉式):即项目启动时即加载;
  2. 懒加载(懒汉式):在项目使用到时才进行加载;

在实现单例模式时,需要考虑线程安全问题,因为线程不安全情况下会生成多个对象,就失去单例模式的效果;

实现方式

1、饿汉式

静态变量方式实现。给该静态变量赋值的方式可以有两种:

  1. 直接声明时创建;
  2. 在静态代码块中创建对象;
class Singleton{
	// (1)静态变量
    private static final Singleton instance = new Singleton();

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

class Singleton{
    private static final Singleton instance;
    
	//(2)静态代码块赋予
    static {
        instance=new Singleton();
    }
    
    public static Singleton getInstance() {
        return instance;
    }
}
  • 优点
    在类装载时创建,使用final关键字保证了线程同步问题;
  • 缺点
    如果从始至终没有使用过实例,则会造成内存的浪费;

2、懒汉式

方式一:线程不安全

public class Singleton{

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

起到懒加载效果。但只能在单线程模式下使用;多线程环境下会创建多个实例;

方式二:同步方法,线程安全

public class Singleton{

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

同步方法方式,即实现了懒加载,又保证了线程安全。但问题:效率太低;因为每次获取实例都需要进行同步操作。

方式三:双重检查锁

public class Singleton{

    private static volatile Singleton instance;

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

使用同步代码块并多添加一层判断,避免多个线程创建对象,实现线程安全、懒加载效果,效率较高。

方式四:静态内部类

public class Singleton{

    static class SingletonInstance{
        private static final Singleton INSTANCE = new Singleton();
    }

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

类加载时,类的内部类不会立即装载,使用时才会被装载,所以使用静态内部类可以实现懒装载效果。同时,使用final修饰符对象变量,避免线程不安全问题,效率也高。

方式五:枚举

public enum  Singleton{
    INSTANCE;
}

public class SingletonType1 {
    public static void main(String[] args) {
        Singleton instance = Singleton.INSTANCE;
        Singleton instance2 = Singleton.INSTANCE;
        System.out.println(instance==instance2);
    }
}

借助JDK1.5特性枚举实现单例模式,不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。

细节

单例模式保证了系统内存中只存在一个对象实例,节省系统资源,对于需要频繁创建销毁的对象,使用单例模式可以提高系统性能。
获取单例类对象时,不通过new方式重新创建,而是通过getInstance()方法直接获取已创建好的对象。

使用场景

  1. 程序线程中不会改变类对象的状态;
  2. 需要频繁进行创建和销毁的对象;
  3. 创建时非常耗时和耗资源的重量级对象;
  4. 经常使用的对象;比如:工具类对象、频繁访问数据库或文件的对象;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值