网站流量提供商,wordpress 添加熊掌号,郴州网站建设公司有哪些,jsp网站设计类的单例设计模式#xff0c;就是采取一定的方法保证在整个的软件系统中#xff0c;对某个类只能存在一个对象实例#xff0c;并且该类只提供一个取得其对象实例的方法#xff08;静态方法#xff09;
指一个类只有一个实例#xff0c;且该类能自行创建这个实例的一种模…类的单例设计模式就是采取一定的方法保证在整个的软件系统中对某个类只能存在一个对象实例并且该类只提供一个取得其对象实例的方法静态方法
指一个类只有一个实例且该类能自行创建这个实例的一种模式。
特点
某个类只能有一个实例即构造器私有防止外部通过new XXX()创建对象
自行在类的内部创建对象实例
向外暴露一个静态的公共方法
八种单例模式实现方式 饿汉式静态常量 饿汉式静态代码块 懒汉式线程不安全 懒汉式线程安全同步方法 懒汉式线程安全同步代码块 双重检查 静态内部类 枚举
饿汉式静态常量
public class Singleton {//创建实例对象private final static Singleton instance new Singleton();/*** 构造器私有化防止外部类能直接new*/private Singleton() {}/*** 提供一个公有的静态方法返回实例对象* return*/public static Singleton getInstance() {return instance;}
}类装载的时候就完成实例化避免了线程同步问题如果从始至终都没有用到这个实例则会造成内存的浪费
饿汉式静态代码块
public class Singleton {//实例对象private static Singleton instance;/*** 在静态代码块中创建单例对象*/static {instance new Singleton();}/*** 构造器私有化防止外部类能直接new*/private Singleton() {}/*** 提供一个公有的静态方法返回实例对象* return*/public static Singleton getInstance() {return instance;}
}
同上
懒汉式线程不安全
当需要使用到对象的时候才会创建对象即懒汉式
public class Singleton {//实例对象private static Singleton instance;/*** 构造器私有化防止外部类能直接new*/private Singleton() {}/*** 提供一个公有的静态方法当使用到该方法时才会创建instance* return*/public static Singleton getInstance() {//若对象为空则创建if (instance null) {instance new Singleton();}return instance;}
}
起到了懒加载的效果但是只能在单线程下使用在实际开发中不要使用这种方式
懒汉式线程安全同步方法
public class YamlUtils {private static YamlUtils instance; // 类实例变量private YamlUtils() {loadConfig(); // 加载配置信息}/*** 提供一个公有的静态方法加入同步处理解决线程安全问题* return*/public static synchronized YamlUtils getInstance() {if (instance null) { // 若实例为空则创建新实例instance new YamlUtils();}return instance;}private void loadConfig() {}}
效率低每个线程在想获得类的实例时候执行 getInstance()方法都要进行同步而其实这个方法只执行一次实例化代码就够了后面的想获得该类的实例直接 return 就行方法进行同步效率太低
在实际开发中不推荐使用
懒汉式线程安全同步代码块
class Singleton {//实例对象private static Singleton instance;/*** 构造器私有化防止外部类能直接new*/private Singleton() {}/*** 提供一个公有的静态方法* return*/public static Singleton getInstance() {//若对象为空则创建if (instance null) {//同步代码块synchronized (Singleton.class) {instance new Singleton();}}return instance;}
}
因为上面实现方式的同步方法效率太低改为同步产生实例化的代码块
同步并不能起到线程同步的作用假如一个线程进入了判断语句还没有执行对象实例化另一个线程也通过了这个判断语句这是便会产生多个实例
实际开发中不能使用这种方式
双重检查
public class Singleton {//实例对象private static volatile Singleton instance;/*** 构造器私有化防止外部类能直接new*/private Singleton() {}/*** 提供一个公有的静态方法加入双重检查处理解决线程安全问题* 同时解决懒加载问题也保证了效率* return*/public static Singleton getInstance() {//实例没创建才会进入内部的 synchronized代码块if (instance null) {synchronized (Singleton.class) {//此处再判断一次可能会出现其他线程创建了实例if (instance null) {instance new Singleton();}}}return instance;}
}
1、DoubleCheck 概念是多线程开发中常使用到的如代码中所示进行了两次 if (instance null)检查这样就保证了线程安全。 2、实例化代码只用执行一次后面再次访问时判断 if (instance null)直接 return 实例化对象也避免反复进行方法同步。 3、线程安全延迟加载效率较高。 4、推荐使用这种单例设计模式。
静态内部类
public class Singleton {private Singleton() {}/*** 静态内部类类中有一个静态属性*/private static class SingletonInstance {private static final Singleton INSTANCE new Singleton();}public static final Singleton getInstance() {return SingletonInstance.INSTANCE ;}
}
1、这种方式采用了类装载的机制来保证初始化实例时只有一个线程。 2、静态内部类方式在 Singleton 类被装载时并不会立即实例化而是在需要实例化时调用 getInstance 方法时才会装载 SingletonInstance 类从而完成 Singleton 的实例化。 3、类的静态属性只会在第一次加载类的时候初始化所以在这里JVM 帮助我们保证了线程的安全性在类进行初始化时别的线程是无法进入的。 4、避免了线程不安全利用静态内部类特点实现延迟加载效率高推荐使用。
枚举实现单例模式
public enum Singleton{INSTANCE;public Singleton getInstance(){return INSTANCE;}
}public class SingletonTest01 {public static void main(String[] args) {Singleton instance1 Singleton.INSTANCE.getInstance();Singleton instance2 Singleton.INSTANCE.getInstance();System.out.println(instance1 instance2);System.out.println(instance1 instance1.hashCode());System.out.println(instance2 instance2.hashCode());}
}
1、借助 JDK1.5 中添加的枚举来实现单例模式。不仅能避免多线程同步问题而且还能防止反序列化重新创建新的对象
推荐使用
总结
1、单例模式保证了系统内存中该类只存在一个对象节省了系统资源对于一些需要频繁创建销毁的对象使用单例模式可以提高系统性能。 2、当想实例化一个单例类的时候必须要记住使用相应的获取对象的方法而不是使用 new。 3、单例模式使用的场景 需要频繁的进行创建和销毁的对象、创建对象时耗时过多或耗费资源过多即重量级对象但又经常用到的对象、工具类对象、频繁访问数据库或文件的对象如数据源、session 工厂等