| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> Java知识库 -> 单例模式及getInstance()的用法(转) -> 正文阅读 |
|
[Java知识库]单例模式及getInstance()的用法(转) |
?介绍
意图:当我们想要一个类在系统操作运行时只有一个实例时,可以采用单例模式。 如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。 使用场景:????????要求生成唯一序列号。 ? ? ? ? ? ? ? ? ? ? ? ? ? WEB中的计数器,不用每次刷新都在数据库里加一次,用单例先缓存起来 ? ? ? ? ? ? ? ? ? ? ? ? ? 创建的一个对象需要消耗的资源过多,比如比如 I/O 与数据库的连接等。 实现我们将创建一个?SingleObject?类。SingleObject?类有它的私有构造函数和本身的一个静态实例。 SingleObject?类提供了一个静态方法,供外界获取它的静态实例。SingletonPatternDemo?类使用?SingleObject?类来获取?SingleObject?对象。 步骤 1????????创建一个Singleton 类
步骤 2????????从 singleton 类获取唯一的对象。
单例模式的几种实现方式1、懒汉式,线程不安全是否 Lazy 初始化:是 是否多线程安全:否 实现难度:易 描述:这种方式是最基本的实现方式,这种实现最大的问题就是不支持多线程。因为没有加锁 synchronized,所以严格意义上它并不算单例模式。这种方式 lazy loading 很明显,不要求线程安全,在多线程不能正常工作。
2、懒汉式,线程安全是否 Lazy 初始化:是 是否多线程安全:是 实现难度:易 描述:这种方式具备很好的 lazy loading,能够在多线程中很好的工作,但是,效率很低,99% 情况下不需要同步。
3、饿汉式是否 Lazy 初始化:否 是否多线程安全:是 实现难度:易 描述:这种方式比较常用,但容易产生垃圾对象。
4、双检锁/双重校验锁(DCL,即 double-checked locking)JDK 版本:JDK1.5 起 是否 Lazy 初始化:是 是否多线程安全:是 实现难度:较复杂 描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
5、登记式/静态内部类是否 Lazy 初始化:是 是否多线程安全:是 实现难度:一般 描述:这种方式能达到双检锁方式一样的功效,但实现更简单。对静态域使用延迟初始化,应使用这种方式而不是双检锁方式。这种方式只适用于静态域的情况,双检锁方式可在实例域需要延迟初始化时使用。
6、枚举JDK 版本:JDK1.5 起 是否 Lazy 初始化:否 是否多线程安全:是 实现难度:易 描述:这种实现方式还没有被广泛采用,但这是实现单例模式的最佳方法。它更简洁,自动支持序列化机制,绝对防止多次实例化。
懒汉式与饿汉式的根本区别在与是否在类内方法外创建自己的对象。 并且声明对象都需要私有化,构造方法都要私有化,这样外部才不能通过 new 对象的方式来访问。 饿汉式的话是声明并创建对象,懒汉式的话只是声明对象,在调用该类的 getinstance() 方法时才会进行 new 对象。 |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年3日历 | -2025/3/4 2:43:47- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |