JAVA设计模式【二】 - 单例模式

本文详细介绍了单例模式的概念及其在软件开发中的应用。探讨了多种实现单例模式的方法,包括饿汉模式、懒汉模式的不同变种(如非线程安全、线程安全及双重检查锁定),以及静态内部类模式等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

单例模式
 
    单例模式是比较常用和容易理解的一种设计模式,目的是一个单例对象的类只允许存在一个实例。
常用的例如数据库连接池和多线程的线程池就是单例模式的。
 
单例模式的几种实现方式:
 
饿汉模式:
 
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
    private static Singleton ourInstance = new Singleton();
 
    public static Singleton getInstance() {
        return ourInstance;
    }
 
    private Singleton() {}
}
    这种方式 因为定义实例为静态的,所以在虚拟机对该类进行装载的时候就会生成实例。属于常用的方式,但是缺点在于如果不需要调用该实例会对内存造成浪费。
 
非线程安全-懒汉模式:
 
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
    public static Singleton singleton;
 
    public static Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }
 
    private Singleton() {}
}
 
顾名思义,就是在不需要该实例的时候不创建,只有在第一次用到的时候会创建该实例,但是此方式不建议使用,因为是非线程安全的,如果多线程同时获取实例,并且在同时验证实例为空时通过,会创建两个实例。
 
线程安全-同步-懒汉模式:
 
public class Singleton {
    public static Singleton singleton;
 
    public static synchronized Singleton getInstance() {
        if (singleton == null) {
            singleton = new Singleton();
        }
        return singleton;
    }    
 
    private Singleton() {}
}
 
在获取对象的实例方法上通过synchronized关键字为该方法添加同步锁,这样可以保证只有一个线程会调用该方法,但是如果多线程同时过来时就会发生线程堵塞,造成效率性能的极度下降,所以不建议采用此方式。
 
非线程安全-同步代码块-懒汉模式:
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
    public static Singleton singleton;
 
    public static Singleton getInstance() {
 
        if (singleton == null) {
            synchronized (Singleton.class){
                singleton = new Singleton();
            }
        }
        return singleton;
    }
 
    private Singleton() {}
}
 
当多个线程同时进入到null判断之后,虽然锁的是代码块,但是还会执行两次实例化。
 
双重检查模式
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
    public static Singleton singleton;
 
    public static Singleton getInstance() {
 
        if (singleton == null) {
            synchronized (Singleton.class) {
                if (singleton == null) {
                    singleton = new Singleton();
                }
            }
        }
        return singleton;
    }
 
    private Singleton() {}
}
这样可以保证是线程安全的。
 
静态内部类模式
 
/**
* Created by j on 2018/3/1.
*/
public class Singleton {
 
    private Singleton() {}
 
    private static class SingletonIns{
        private static final Singleton instance = new Singleton();
    }
 
    public static Singleton getInstance() {
        return SingletonIns.instance;
    }
}
这样与饿汉模式相似,该模式是懒加载模式,饿汉模式在类被装载时创建实例,而该模式,只有在调用getInstance时才会装载静态内部类,然后创建实例。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值