电子商务旅游网站建设论文,个人永久免费自助建站,wordpress 绑定域名,迅速建设企业网站基本概念
单例模式#xff1a;保证一个类只有一个实例#xff0c;并提供一个访问该实例的全局访问点
常见应用场景
读取配置文件的类一般设计为单例模式网站计数器应用程序的日志应用#xff0c;因为共享日志文件一直处于打开状态#xff0c;只能有一个实例去操作Spring…基本概念
单例模式保证一个类只有一个实例并提供一个访问该实例的全局访问点
常见应用场景
读取配置文件的类一般设计为单例模式网站计数器应用程序的日志应用因为共享日志文件一直处于打开状态只能有一个实例去操作Spring 中初始化 bean 默认为单例Servlet 编程中每个 servlet 都是单例Spring MVC / Struts1 框架控制器对象是单例
单例模式优点
(1) 由于单例模式只生成一个实例减少了系统性能开销当一个对象的产生需要比较多的资源时如读取配置、产生其他依赖对象时可以通过在应用启动时直接产生一个单例对象然后以永久驻留内存的方式解决
(2) 单例模式可以在系统设置全局变量访问点优化了共享资源的访问
常见单例实现方式
1. 饿汉式静态常量
优点写法简单在类加载时就完成了实例化避免了线程同步问题
缺点没有达到懒加载的效果如果没有用到这个实例将造成内存浪费
结论可用于实际开发
public class Singleton {/*** 1.构造器私有化*/private Singleton() {}/*** 2.类内部创建对象实例*/private final static Singleton INSTANCE new Singleton();/*** 3.提供公有静态方法返回实例对象*/public static Singleton getInstance() {return INSTANCE;}
}2. 饿汉式静态代码块
该方式和静态常量的方式类似只不过将类实例化的过程放在了静态代码块中即在类装载的时候就执行静态代码块中的代码初始化类的实例优缺点和静态常量的方式一样
结论可用于实际开发
public class Singleton {/*** 1.构造器私有化*/private Singleton() {}/*** 2.类内部创建对象属性*/private static Singleton INSTANCE;/*** 3.在静态代码块中创建单例对象*/static {INSTANCE new Singleton();}/*** 4.提供公有静态方法返回实例对象*/public static Singleton getInstance() {return INSTANCE;}
}3. 懒汉式线程不安全
优点起到了懒加载的效果但只能在单线程的场景下使用
缺点如果在多线程下一个线程还在 if 判断语句块而另一个线程通过了 if 代码块就会产生多个实例
结论实际开发中不推荐使用该方式
public class Singleton {/*** 1.构造器私有化*/private Singleton() {}/*** 2.类内部创建对象属性*/private static Singleton INSTANCE;/*** 3.提供公有静态方法返回实例对象*/public static Singleton getInstance() {return null INSTANCE ? new Singleton() : INSTANCE;}
}4. 懒汉式线程安全同步方法
对方式 3 进行改进对返回单例对象的 getInstance() 方法添加 synchronized保证线程安全即多个线程不能同时调用 getInstance() 方法
优点解决了线程不安全的问题
缺点效率太低多个线程想获取类的实例的时候执行 getInstance() 方法都要同步而其实该方法只执行一次实例化代码就够了其他的线程想获取该类的实例直接 return 就行了使用方法同步降低了效率
结论实际开发中不推荐使用该方式 public class Singleton { /** * 1.构造器私有化 */ private Singleton() {}
/*** 2.类内部创建对象属性*/
private static Singleton INSTANCE;/*** 3.提供公有静态方法返回实例对象*/
public static synchronized Singleton getInstance() {return null INSTANCE ? new Singleton() : INSTANCE;
}}
5. 双重检查
加入了双重检查代码解决了线程安全的问题同时也解决了懒加载的问题效率较高
结论可用于实际开发
public class Singleton {/*** 1.构造器私有化*/private Singleton() {}/*** 2.类内部创建对象属性*/private static volatile Singleton INSTANCE;/*** 3.提供公有静态方法返回实例对象*/public static Singleton getInstance() {if(null INSTANCE) {// 保证创建实例对象的时候, 只能有一个线程synchronized(Singleton.class) {if(null INSTANCE) {INSTANCE new Singleton();}}}return INSTANCE;}
}6. 静态内部类推荐
当外部类 Singleton 装载的时候内部类 SingletonInstance 并不会立即装载实现了延迟加载
只有在调用 getInstance() 方法的时候才使用到内部类这时候内部类才会装载而类的装载过程是线程安全的即保证了线程安全
所以静态内部类这种方式既保证了懒加载又保证了线程安全
结论强烈推荐
public class Singleton {/*** 1.构造器私有化*/private Singleton() {}/*** 2.通过静态内部类实例化对象*/private static class SingletonInstance {private static final Singleton INSTANCE new Singleton();}/*** 3.提供公有静态方法返回实例对象*/public static Singleton getInstance() {return SingletonInstance.INSTANCE;}
}7. 枚举推荐
借助 JDK1.5 添加的枚举实现单例模式不仅避免了多线程同步的问题还能防止反序列化重新创建新的对象
结论强烈推荐
public enum Singleton {/*** 定义单例对象属性*/INSTANCE;/*** 定义单例对象方法*/public void method() {System.out.println(枚举实现单例);}
}不同实现方式效率对比