1、单例模式可以确保一个类只有一个实例并提供全局访问点,单例模式又分为懒汉模式和恶汉模式,在工具类和或需要频繁进行创建和销毁的对象等场景中可以使用。下面先实现一个最简单的单例模式,也就是枚举类型的。
public enum Singleton {
INSTANCE;
public void doSomething() {
}
}
2、恶汉模式:在类加载时候就会创建,假设类未使用到就会造成内存浪费或是个大对象可能也会影响程序的启动。
public class User {
// 也可放在静态代码块中使用
private static User user = new User;
// 构造函数私有化
private User(){ }
public static User getUser() {
return user;
}
}
3、懒汉模式(双重检测锁):只有在使用的时候才会创建,优点是不会造成内存浪费按需使用,缺点就是存在线程安全问题,可以使用synchronized锁来解决,以下使用的是双重检查锁来实现懒汉模式的线程安全,避免了在多个线程都通过user==null检查时产生多个实例。
public class User {
private static volatile User user;
private User(){}
public static User getUser(){
if (user == null){
//也可以锁住方法,但是锁粒度太大
synchronized (User.class) {
if (user == null){
user = new User();
}
}
}
return user;
}
}
4、静态内部类(类加载机制):SingletonInstance是一个静态内部类,它的加载和初始化都是在第一次访问是才进行的,从而确保在外部类被加载时内部类不会被加载。优点就是既能实现懒汉模式的单例模式又能利用类的加载机制保证线程安全,也不需要额外的锁同步机制。
public class Singleton {
private Singleton(){}
private static class SingletonInstance{
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance(){
return SingletonInstance.INSTANCE;
}
}