概述:单例设计模式是一种创建型设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。
介绍:饿汉式是一种单例设计模式的实现方式,其核心思想是在类加载时就创建实例对象并将其静态化,之后在每次获取实例时直接返回该静态对象。因此,饿汉式实现起来相对简单,在多线程环境下也比较安全,但是如果该实例一直没有被使用,会浪费一定的系统资源。
代码实现:
public class Singleton {
/**
* 将自身实例化对象设置为一个属性,并用static修饰
*/
private static final Singleton INSTANCE = new Singleton();
/**
* 构造方法私有化,防止外部实例化对象
*/
private Singleton() {
}
/**
* 静态方法返回该实例
*
*/
public static Singleton getInstance() {
return INSTANCE;
}
/**
* 测试单例是否唯一
*/
public static void main(String[] args) {
System.out.println(singleton.enum_.Singleton.getInstance() == singleton.enum_.Singleton.getInstance());
}
}
代码解析:
这是一个单例模式的经典实现,具体解释如下:
总的来说,该实现方式简单明了,且具有较好的线程安全性和性能,是单例模式的经典实现方式之一。
介绍:懒汉式是单例模式的一种实现方式,其特点是在需要时才创建实例,而不是在类加载时就创建实例。懒汉式通常有两种实现方式:加锁的和不加锁的
代码实现:
public class Singleton {
/**
* 将自身实例化对象设置为一个属性,并用static修饰
*/
private static Singleton INSTANCE;
/**
* 构造方法私有化,防止外部实例化对象
*/
private Singleton() {
}
/**
* 静态方法返回该实例
*
*/
public static Singleton getINSTANCE() {
if (INSTANCE == null) {
INSTANCE = new Singleton();
}
return INSTANCE;
}
/**
* 测试单例是否唯一
*/
public static void main(String[] args) {
System.out.println(singleton.enum_.Singleton.getInstance() == singleton.enum_.Singleton.getInstance());
}
}
代码解析:
这是一个单例模式的懒汉式实现,具体解释如下:
总的来说,该实现方式实现了懒加载的效果,但由于在多线程环境下存在竞争条件,可能会导致多个线程同时创建实例,从而影响单例的唯一性。因此,在多线程环境下需要进行线程安全处理。
➡️➡️这是懒汉式的单例实现方式,与饿汉式的主要区别是:懒汉式在第一次调用 getINSTANCE()
方法时才会实例化对象,而不是在类加载时就实例化对象。
if (INSTANCE == null)
的判断语句,导致多次实例化。getINSTANCE()
方法上加锁,或者使用双重校验锁等方式来保证线程安全。介绍:双重检查锁实现单例设计模式-懒汉式,是一种更加高效、线程安全的单例实现方式。它利用了volatile关键字和synchronized关键字的特性,避免了多线程环境下创建多个实例的问题。
代码实现:
public class Singleton {
/**
* 将自身实例化对象设置为一个属性,并用static、volatile修饰
*/
private static volatile Singleton singleton;
//锁
private final static Object MONITOR = new Object();
/**
* 构造方法私有化,防止外部实例化对象
*/
private Singleton() {
}
/**
* 静态方法获取实例
*/
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (MONITOR) {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
return singleton;
}
/**
* 测试单例是否唯一
*/
public static void main(String[] args) {
System.out.println(singleton.enum_.Singleton.getInstance() == singleton.enum_.Singleton.getInstance());
}
}
代码解析:
这是一个单例模式的懒汉式-双重检查锁实现,具体解释如下:
总的来说,该实现方式采用了双重检查锁机制来保证线程安全性和懒加载效果,同时也兼顾了性能问题。但是,需要注意的是,该方式并不是完美的,可能存在一些潜在的问题,如可能会受到指令重排序等问题的影响,需要开发者根据具体情况进行实际应用。
介绍:
代码实现:
public class Singleton {
/**
* 构造器私有化,防止外部实例化
*/
private Singleton() {
}
/**
* 返回单例实例的静态方法
*/
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
/**
* 写一个静态内部类,里面实例化外部类
*/
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
/**
* 测试单例是否唯一
*/
public static void main(String[] args) {
System.out.println(singleton.enum_.Singleton.getInstance() == singleton.enum_.Singleton.getInstance());
}
}
代码解析:
这是静态内部类实现单例设计模式的经典写法。具体解释如下:
总的来说,这种实现方式既保证了线程安全性,又实现了懒加载,同时代码量也比较简洁,是静态内部类实现单例设计模式的经典写法。
介绍:
使用枚举类实现单例模式是一种简单、安全、易于实现的方式,因为枚举类本身就保证了单例的唯一性,同时也避免了其他单例模式中可能遇到的反射攻击和序列化问题。
在使用枚举类实现单例模式时,只需要声明一个枚举类型,并在其中定义一个实例,这个实例就是该单例模式的唯一实例,而且该实例是由枚举类在加载时自动创建的,因此无需考虑线程安全等问题。同时,由于枚举类是final类型的,不允许被继承,也不允许通过反射来创建实例,因此可以很好地避免反射攻击和序列化问题。
代码实现:
public class Singleton {
/**
* 构造器私有化,防止外部实例化
*/
private Singleton() {
}
/**
* 返回单例实例的静态方法
*/
public static Singleton getInstance() {
return SingletonHolder.INSTANT.instance;
}
/**
* 静态内部枚举类,实例化单例对象
*/
private enum SingletonHolder {
INSTANT;
private final Singleton instance;
/**
* 实例化单例对象
*/
SingletonHolder() {
instance = new Singleton();
}
}
/**
* 测试单例是否唯一
*/
public static void main(String[] args) {
System.out.println(Singleton.getInstance() == Singleton.getInstance());
}
}
代码解析:
这段代码是通过枚举类实现单例模式。具体解释如下:
总的来说,枚举类实现单例模式的代码比较简洁,而且线程安全性和序列化安全性都能得到保障,因此在实际开发中也比较常用。