java单例模式,单例模式懒汉和饿汉

Java单例模式简单吗?

java单例模式,单例模式懒汉和饿汉


Java单例说起来简单 , 很多初学者也学起来也认为很简单 , 但是深入思考一下 , 就会发现没那么简单 。单例要考虑到多线程并发访问的问题 , 就会变得复杂起来 。如何保证线程安全?比较常见的方法就是使用DCL(Double Check Lock)单例 。实现代码如下:这里还要特别注意 , INSTANCE前还需要加上volatile修饰符 。
为什么要加这个修饰符呢?这里就涉及到CPU底层的一些知识了 。简单来说 , CPU底层执行指令的时候会对不同的指令进行重排序 , 我们Java代码里的一行代码 , 在CPU底层可能是多条指令 , 如果发生了重排序 , 单例对象实例化过程中可能会把半初始化状态的对象返回 , 那么当前线程获取到的实例与其他线程获取的完全初始化的对象就不一样了 。
单例模式有几种?如何优化?
在有些系统中 , 为了节省内存资源、保证数据内容的一致性 , 对某些类要求只能创建一个实例 , 这就是所谓的单例模式 。单例模式的定义与特点单例(Singleton)模式的定义:指一个类只有一个实例 , 且该类能自行创建这个实例的一种模式 。例如 , Windows 中只能打开一个任务管理器 , 这样可以避免因打开多个任务管理器窗口而造成内存资源的浪费 , 或出现各个窗口显示内容的不一致等错误 。
在计算机系统中 , 还有 Windows 的回收站、操作系统中的文件系统、多线程中的线程池、显卡的驱动程序对象、打印机的后台处理服务、应用程序的日志对象、数据库的连接池、网站的计数器、Web 应用的配置对象、应用程序中的对话框、系统中的缓存等常常被设计成单例 。单例模式在现实生活中的应用也非常广泛 , 例如公司 CEO、部门经理等都属于单例模型 。
J2EE 标准中的 ServletContext 和 ServletContextConfig、Spring 框架应用中的 ApplicationContext、数据库中的连接池等也都是单例模式 。单例模式有 3 个特点:单例类只有一个实例对象;该单例对象必须由单例类自行创建;单例类对外提供一个访问该单例的全局访问点 。
单例模式的优点和缺点单例模式的优点:单例模式可以保证内存里只有一个实例 , 减少了内存的开销 。可以避免对资源的多重占用 。单例模式设置全局访问点 , 可以优化和共享资源的访问 。单例模式的缺点:单例模式一般没有接口 , 扩展困难 。如果要扩展 , 则除了修改原来的代码 , 没有第二种途径 , 违背开闭原则 。在并发测试中 , 单例模式不利于代码调试 。
在调试过程中 , 如果单例中的代码没有执行完 , 也不能模拟生成一个新的对象 。单例模式的功能代码通常写在一个类中 , 如果功能设计不合理 , 则很容易违背单一职责原则 。单例模式看起来非常简单 , 实现起来也非常简单 。单例模式在面试中是一个高频面试题 。希望大家能够认真学习 , 掌握单例模式 , 提升核心竞争力 , 给面试加分 , 顺利拿到 Offer 。
单例模式的应用场景对于 Java 来说 , 单例模式可以保证在一个 JVM 中只存在单一实例 。单例模式的应用场景主要有以下几个方面 。需要频繁创建的一些类 , 使用单例可以降低系统的内存压力 , 减少 GC 。某类只要求生成一个对象的时候 , 如一个班中的班长、每个人的身份证号等 。某些类创建实例时占用资源较多 , 或实例化耗时较长 , 且经常使用 。

推荐阅读