所谓类的单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。
饿汉式:线程安全,无论是否被使用,类加载时就会创建对象,消耗资源。
1.私有化构造器
2.内部提供一个当前类的实例,并显示初始化
3.提供公共的静态的方法,返回当前类的对象
class Singleton {
// 1.私有化构造器
private Singleton() {
}
// 2.私有化单例对象
private static Singleton single = new Singleton();
// 3.提供公共的静态的方法,返回当前类的对象
public static Singleton getInstance() {
return single;
}
}
懒汉式:线程不安全,但是只有get方法被调用时才会创建对象,节省内存资源
1.私有化构造器
2.内部提供一个当前类的实例
3.提供公共的静态的方法,在方法中给第二步创建的实例赋值,返回当前类的对象
class Singleton {
//2.私有化单例对象
private static Singleton instance = null;
//1.私有化构造器
private Singleton(){}
//3.提供公共的静态的方法,返回当前类的对象
public static Singleton getInstance(){
//只有 instance == null的线程才会进入 同步代码块,提高并发度。
//否则 每个线程都会进入该同步代码块 进行判断,浪费资源。
if(instance==null){
//可能会有多个线程 进入到这一步。
//静态代码块,可以用当前 类对象(类名.class) 作为同步锁。
synchronized(Singleton.class){
//再次判断 避免排队 进入同步代码块的多个线程 重复创建对象。
if(instance == null){
instance=new Singleton();
} } }
return instance;
} }
单例模式的优点:
由于单例模式只生成一个实例,减少了系统性能开销。
参考:单例模式:饿汉式和懒汉式(单例模式详解)