精华内容
下载资源
问答
  • 单例模式 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保...

    单例模式

    单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

    这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

    注意:

    • 1、单例类只能有一个实例。
    • 2、单例类必须自己创建自己的唯一实例。
    • 3、单例类必须给所有其他对象提供这一实例。

    介绍

    意图:保证一个类仅有一个实例,并提供一个访问它的全局访问点。

    主要解决:一个全局使用的类频繁地创建与销毁。

    何时使用:当您想控制实例数目,节省系统资源的时候。

    如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

    关键代码:构造函数是私有的。

    应用实例: 1、一个党只能有一个书记。 2、Windows 是多进程多线程的,在操作一个文件的时候,就不可避免地出现多个进程或线程同时操作一个文件的现象,所以所有文件的处理必须通过唯一的实例来进行。 3、一些设备管理器常常设计为单例模式,比如一个电脑有两台打印机,在输出的时候就要处理不能两台打印机打印同一个文件。

    优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。 2、避免对资源的多重占用(比如写文件操作)。

    缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

    使用场景: 1、要求生产唯一序列号。 2、WEB 中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来。 3、创建的一个对象需要消耗的资源过多,比如 I/O 与数据库的连接等。

    注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

    为什么要用单例模式?

    public class Printer {
        private static Printer printer =null;//创建一个私有的全局变量
        /*
         * 如果有多线程并发访问时,上锁,让其排队等候,一次只能一人用。
         */
        public static synchronized Printer getPrinter(){
            if(printer==null){//如果为空,创建本实例
                printer = new Printer();
            }
            return printer;
        }
        /*
         * 构造私有化,保证在系统的使用中,只有一个实例
         */
        private Printer(){
            
        }
    }

    从代码上来分析,单例模式,首先向外提供了一个可被访问的实例化的对象,如果没有此对象时,该printer类创建一个。如果遇到多线程并发访问,加上关键字Synchronized,上锁让没有持有该对象的类处于等待状态。当前持有该printer的线程任务结束之后,处于等待中的线程才能逐个去持有该实例,去操作其方法。这样的一个过程 在编程中被称为单例模式。
    如果在系统中不使用单例模式的话,在碰到多线程访问的时候,printer就会给要请求的类,分别在内存中new出一个printer对象,让这些请求的类去做print方法。这样大量占有内存,就会导致系统运行变慢,像电脑的CPU一样,占有量极高,电脑卡死不动的感觉。因为系统的硬件设施需求变动量小,所以只能想出一个节约成本 的方法就是,单例模式,让多线程处于等待的状态,一个 一个的去解决,这样,即节约内存,提交了运行的成本。也就是单例存在的意义。

     

    展开全文
  • 文章目录一、什么单例模式二、应用场景三、优缺点四、代码样例总结 一、什么单例模式 单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。 许多时候整个系统只需要拥有一个的全局...

    深入理解设计模式-双锁单例模式


    一、什么是单例模式

    单例模式是一种常用的软件设计模式,其定义是单例对象的类只能允许一个实例存在。
    许多时候整个系统只需要拥有一个的全局对象,这样有利于我们协调系统整体的行为。比如在某个服务器程序中,该服务器的配置信息存放在一个文件中,这些配置数据由一个单例对象统一读取,然后服务进程中的其他对象再通过这个单例对象获取这些配置信息。这种方式简化了在复杂环境下的配置管理。

    在这里插入图片描述


    二、应用场景

    举一个例子,网站的计数器,一般也是采用单例模式实现,如果你存在多个计数器,每一个用户的访问都刷新计数器的值,这样的话你的实计数的值是难以同步的。但是如果采用单例模式实现就不会存在这样的问题,而且还可以避免线程安全问题。同样多线程的线程池的设计一般也是采用单例模式,这是由于线程池需要方便对池中的线程进行控制 同样,对于一些应用程序的日志应用,或者web开发中读取配置文件都适合使用单例模式,如HttpApplication 就是单例的典型应用。 从上述的例子中我们可以总结出适合使用单例模式的场景和优缺点: 适用场景: 1.需要生成唯一序列的环境 2.需要频繁实例化然后销毁的对象。 3.创建对象时耗时过多或者耗资源过多,但又经常用到的对象。 4.方便资源相互通信的环境

    三、优缺点

    优点:
    1.在内存中只有一个对象,节省内存空间;
    2.避免频繁的创建销毁对象,可以提高性能;
    3.避免对共享资源的多重占用,简化访问;
    4.为整个系统提供一个全局访问点。
    缺点:
    1.不适用于变化频繁的对象;
    2.滥用单例将带来一些负面问题,如为了节省资源将数据库连接池对象设计为的单例类,可能会导致共 享连接池对象的程序过多而出现连接池溢出;
    4.如果实例化的对象长时间不被利用,系统会认为该对象是垃圾而被回收,这可能会导致对象状态的丢失;


    四、代码实现

    饿汉单例模式

    public class Singleton1 {
        private static Singleton1 instance = new Singleton1();
    
        private Singleton1(){}
    
        public static Singleton1 getInstance(){
            return instance;
        }
    }
    

    类加载的方式是按需加载,且加载一次。。因此,在上述单例类被加载时,就会实例化一个对象并交给自己的引用,供系统使用;而且,由于这个类在整个生命周期中只会被加载一次,因此只会创建一个实例,即能够充分保证单例,这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。

    懒汉单例模式

    public class Singleton2 {
        private static Singleton2 instance;
    
        private Singleton2(){}
    
        public static Singleton2 getInstance(){
            if (instance == null) {
                instance = new Singleton2();
            }
            return instance;
        }
    }
    

    我们从懒汉式单例可以看到,单例实例被延迟加载,即只有在真正使用的时候才会实例化一个对象并交给自己的引用。
    这种写法起到了Lazy Loading的效果,但是只能在单线程下使用。如果在多线程下,一个线程进入了if (singleton == null)判断语句块,还未来得及往下执行,另一个线程也通过了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式。

    双锁单例模式

    public class Singleton {
        private volatile static Singleton instance;
        private Singleton (){}
        public static Singleton getInstance() {
            if (instance == null) {
                synchronized (Singleton.class) {
                    if (instance == null) {
                        instance = new Singleton();
                    }
                }
            }
            return instance;
        }
    }
    

    双锁模式,进行了两次的判断,第一次是为了避免不要的实例,第二次是为了进行同步,避免多线程问题。由于singleton=new Singleton()对象的创建在JVM中可能会进行重排序,在多线程访问下存在风险,使用volatile修饰signleton实例变量有效,解决该问题。


    总结

    单例模式的实现方法还有很多。上述是比较经典的实现方式,也是我们应该掌握的几种实现方式。
    从这四种实现中,我们可以总结出,要想实现效率高的线程安全的单例,我们必须注意以下两点:
    1.尽量减少同步块的作用域;
    2.尽量使用细粒度的锁。

    展开全文
  • 单例模式解决RabbitMQ超出最大连接问题

    单例模式解决RabbitMQ超出最大连接问题

    参考文章:

    (1)单例模式解决RabbitMQ超出最大连接问题

    (2)https://www.cnblogs.com/monkjavaer/p/9610712.html

    (3)https://www.codeprj.com/blog/92a5d81.html


    备忘一下。


    展开全文
  • 单例模式解决什么问题?单例模式实现1单例模式实现2单例模式实现3单例模式实现4(推荐) 单例模式是什么? 单例模式确保一个类只有一个实例,并提供一个全局访问点。 单例模式解决什么问题? 创建全局变量(类加载才...

    单例模式是什么?

    单例模式确保一个类只有一个实例,并提供一个全局访问点。

    单例模式解决什么问题?

    创建全局变量(类加载才会创建),全局变量也可以保证实例只有一个:

    public static int GLOBAL_VARIABLE;
    
    • program1:全局变量创建时需要赋值
    • program2:无法延迟加载

    单例模式实现1

    1. 创建私有静态变量
    2. 私有化构造函数
    3. 暴露公有方法返回
    public class Singleton {
        private static Singleton singleton;
    
        private Singleton() {
    
        }
    
        public static Singleton getInstance() {
            if (singleton == null) {
                singleton = new Singleton();
            }
            return singleton;
        }
    }
    
    • program1:当两个线程同时进入if (singleton == null)时,就会产生两个实例

    单例模式实现2

    给实现1的getInstance()方法加上synchronized,即可解决产生两个实例的问题:

    public class Singleton {
        private static Singleton singleton;
    
        private Singleton() {
    
        }
    
        public static synchronized Singleton getInstance() {
            if (singleton == null) {
                singleton = new Singleton();
            }
            return singleton;
        }
    }
    
    • program1:加锁降低性能
    • program2:只有在第一次执行getInstance()时才需要同步,之后执行可直接返回

    单例模式实现3

    取消延迟加载,在创建变量时直接初始化,可避免实现1和2的问题:

    public class Singleton {
        private static Singleton singleton = new Singleton();
    
        private Singleton() {
    
        }
    
        public static Singleton getInstance() {
            return singleton;
        }
    }
    

    单例模式实现4(推荐)

    使用双重检查加锁机制,将变量声明为volatile,首先检查是否为空,为空则对类加锁,加锁后再次检查是否为空,为空则创建。

    public class Singleton {
        private volatile static Singleton singleton;
    
        private Singleton() {
    
        }
    
        public static  Singleton getInstance() {
            if (singleton == null) {
                synchronized (Singleton.class) {
                    if (singleton == null) {
                        singleton = new Singleton();
                    }
                }
            }
            return singleton;
        }
    }
    
    展开全文
  • 单例模式存在的问题以及解决方案.pdf
  • 解决懒汉单例模式线程安全问题 1, 懒汉单例模式 package SingleTonTest; /** * @Name: 懒汉单例设计模式 * @Author:ZYJ * @Date:2019-07-25-20:55 * @Description: */ class Singleton{ private static ...
  • 利用单例模式解决全局访问问题
  • 1 破坏单例模式 除枚举方式外,其它单例类(Singleton)可以创建多个对象。有两种方式可以破坏单例模式,分别是序列化和反射。 1.1 序列化反序列化 Singleton类: public class Singleton implements Serializable {...
  • 反射破坏单例模式解决方案 一、前言 如何利用反射破坏单例模式,以及如何防止反射机制破坏单例模式的解决方案。 如有想了解单例模式的实现方式(饿汉式、懒汉式、登记式、ThreadLocal 线程单例),请前往以下...
  • 单例模式中,遇到多线程总要考虑一个性能问题,下面的代码是double-checked locking设计实现单例模式。先判断,如果创建的对象是null,就改加同步锁,然后再判断。这样避免了多线程下的重复创建对象,也解决了...
  • 单例模式什么

    千次阅读 2020-03-01 14:00:13
    什么要用单例模式? 单例模式节省公共资源,对应到我们计算机里面,像日志管理、打印机、数据库连接池、应用配置。 单例模式方便控制,就像日志管理,如果多个人同时来写日志,你一笔我一笔那整个日志文件都...
  • 单例模式解决多线程的问题

    千次阅读 2017-11-04 16:56:27
    1、懒汉模式把getInstance()方法变成同步方法 public class Singleton{ private static Singleton singleton; private Singleton(){} public static synchronized Singleton getInstance(){ if(singleton == ...
  • 双重检测锁单例模式指令重排问题前言双重检测锁单例模式例子更改后的单例问题前因后果 前言 相信大多数同学在面试当中都遇到过写单例模式的题目,那么如何写一个完美的单例是面试者需要深究的问题,因为一个严谨的...
  • 单例模式

    2019-10-30 18:26:34
    单例模式解决问题: 单例模式防止数据处理时发生冲突,解决资源共享操作等问题。 单例模式的两种方式: 1、懒汉模式 说得简单点懒汉模式就是需要用到时才创建(比较懒),如下图所示: 2、饿汉模式 饿汉模式就是...
  • 单例模式理解单例模式实现方法1、懒汉式单例2、饿汉式单例 单例模式有 3 个特点: 单例类只有一个实例对象; 该单例对象必须由单例类自行创建; 单例类对外提供一个访问该单例的全局访问点。 单例模式的优点和...
  • 最初将access_token放到数据库中,每次获取时判断是否过期。...受益于薛喜麟的这篇文章:微信处理access_token全局缓存的问题,实现了用单例模式来缓存access_token。记一下,供以后查用。mark一下自己的...
  • 序列化破环单例模式,实例代码如下: (1) 饿汉式单例模式,实现了序列化接口 public class SeriableSingleton implements Serializable{ private static final SeriableSingleton instance=new ...
  • 单例模式详解一、单例模式的定义及应用场景二、饿汉式单例模式(一)、饿汉式单例...ExcetorThread(2)、测试类:LazySimpleSingletonTest3、模拟线程安全问题原因分析(四)、懒汉式单例模式代码案例一的解决方法1
  • 目录 最终解决方案 探讨为何这么写? 最终解决方案 双重检查加锁 首先检查是否实例已经创建了,如果尚未创建,才进行同步。这样一来,只有第一次会同步 ...public class ... //单例解决并发问题 if (sn
  • 文章目录饿汉单例模式懒汉单例模式 单例模式如图: useClientSingleton 角色介绍: 1.Client—高层客户端 2.Singleton----单例类 实现单例模式主要有如下几个关键点: 构造函数不对外开放,一般为private ...
  • 目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...
  • Java单例模式及破坏单例的解决方法

    千次阅读 2018-10-03 23:13:54
    单例模式分为懒汉式与饿汉式 先来说说懒汉式 public class Test { public static void main(String[] args) { LazySingleton.getInstance(); } } //懒汉式单例 class LazySingleton{ private static ...
  • 单例模式加锁优化问题

    千次阅读 2016-07-21 16:39:32
    单例模式单例模式特点: 只有一个实例 私有构造函数 单例模式应用场景: 具有资源管理器的功能的应用,如打印机、线程池、缓存、显卡驱动等等 像我这初学的渣渣程序媛,在Android开发中用的最多的地方就是数据库DAO...
  • 目录设计模式简介单例模式的简介单例模式的实现实现方式一:饿汉式(单例对象立即加载)实现方式二:懒汉式(单例对象延迟加载)实现方式三:双重检测锁实现(不建议使用)实现方式四:静态内部类实现方式(懒加载...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 133,111
精华内容 53,244
关键字:

单例模式解决什么问题