兰州装饰公司十强,烟台网站排名优化费用,网站开发总结性报告,濮阳房产网站建设概述上一篇日志中#xff0c;我们介绍了单例模式的概念和基础的应用本节中#xff0c;我们就来介绍一下 java 语言中如何编写单例模式类只适合单线程环境的单例模式public class Singleton {private static Singleton instance null;private Singleton() { }public static S…概述上一篇日志中我们介绍了单例模式的概念和基础的应用本节中我们就来介绍一下 java 语言中如何编写单例模式类只适合单线程环境的单例模式public class Singleton {private static Singleton instance null;private Singleton() { }public static Singleton getInstance(){if (instance null) {instance new Singleton();}return instance;}}这是单例模式的最简单实现private 的构造方法保证了类不会被通过 new 的方式创建同时判断 instance 是否为 null 保证了单线程环境下单例模式运行的正确性但是正如我们反复强调的这种方式是非线程安全的原因在于当多个线程并发执行同时进行判断 instance 为 null 的操作而此时 instance 确实为 null那么所有的线程都将去创建一个单例的对象这显然是我们不希望看到的那么下面我们就来解决这个问题通过同步锁实现线程安全正如上面提到的之所以存在线程安全问题主要是因为判断 instance 是否为 null 与对象的创建是非原子性的那么我们只需要用锁来保证两个操作的原子性即可解决这个问题public class Singleton {private static Singleton instance null;private Singleton() { }public static synchronized Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}}但是加锁对性能是会造成影响的在并发环境下当一个线程运行到 synchronized 处获取锁进入到 instance 的判断其他所有的并发线程都必须在该线程执行完 instance 的创建操作后才能够继续执行而事实上一旦 instance 被创建这样的等待都将会是白费的双重校验锁双重校验锁对上面的例子进行了优化public class Singleton {private static Singleton instance null;private Singleton() { }public static Singleton getInstance() {if (instance null) {synchronized (Singleton.class) {if (instance null) {instance new Singleton();}}}return instance;}}一旦对象被创建那么程序将不会去请求获取锁而是直接返回 instance最简单的线程安全单例模式public class Singleton {private static Singleton instance new Singleton();private Singleton() { }public static Singleton getInstance() {return instance;}}这段代码看上去非常简单他会在类首次被加载时创建单例的对象jvm 会保证单例对象只被创建一次但是有时我们仅仅是在代码中引用了这个类或者仅仅调用了这个类中的其他方法我们并不希望在我们还不需要通过 getInstance 方法获取对象的时候对象就已经被创建了这是这种方式的主要问题静态内部类public class Singleton {private Singleton() {}private static class SingletonHolder {private final static Singleton instance new Singleton();}public static Singleton getInstance() {return SingletonHolder.instance;}}这种方式解决了上一种方式所存在的问题仅在 getInstance 方法被调用时对象才会被创建使用枚举public enum SingletonEnum {BOOM_MAZE_FACTORY(new BoomMazeFactory()),STANDARD_MAZE_FACTORY(new StandardMazeFactory()),;private MazeFactory mazeFactory;public MazeFactory getMazeFactory() {return mazeFactory;}SingletonEnum(MazeFactory mazeFactory) {this.mazeFactory mazeFactory;}}由于枚举在项目中并不会被常常用到这样的用法就更加难得一见了而事实上这才是最推荐的用法微信公众号欢迎关注微信公众号以技术为主涉及历史、人文等多领域的学习与感悟每周三到七篇推文只有全部原创只有干货没有鸡汤标签技术帖技术分享javasingleton设计模式模式设计单例