java singleton(单例设计模式)
单例设计模式的主要作用是:
1.控制资源的使用,我们对资源使用线程同步来实现并发访问。
2.节约资源,我们对一个类只进行一个实例化进行全局的资源访问,节约了内存。
3.作为通信媒介,也是数据共享,可以让两个或者多个互不相关的线程或进程之间进行通信。
-------------------------------------------------------------------------------------------------------------------
几个使用单例模式设计的应用场景
在社交网站上显示在线人数时,我们把在线人数的数据存储到数据库中,我们可以对在线人数这个对象进行new,当上线一个人时就从数据库提取在线人数数据,进行加1的操作,有人下线时,从数据库中提取在线人数数据,进行减1操作。但是这样有线程安全问题,如果在同一个时间有两个或者多个人上线或下线,我们此时进行在线人数数据的增减操作,会出现显示在线人数和我们实际在线人数不一致的问题,所以我们可以使用单例设计模式来很好的解决这个问题。让在线人数示例一个全局对象,所有人都共同使用同一个对象进行数据的访问。
我们在使用打印机的时候,如果一个进程或者线程都独立占用打印机,那么打印出来的结果可能是多台打印机执行打印任务的组合,我们可以使用案例设计模式对打印机任务设计一个单例模式的脱机服务Printer Spooler,所有的打印任务都通过Printer Spooler进行。
数据库连接池服务也是一个典型的单例设计模式,数据库连接池的作用是节省打开或者关闭数据库时的效率损耗,这种损耗是非常严重的。还可以屏蔽不同数据库之间的差异,降低系统对数据库的耦合度,方便对数据库进行管理等等。数据库连接池是重量级资源,一个应用中只需要一个就可以了,既节省资源又方便操作,非常适合采用单例设计模式。
windows操作系统中对任务管理器的操作也是单例设计模式,对管理器中的任务我们只能在同一时间进行单独的操作,我们再进行文件操作时,可能会有多个线程对文件进行操作,采用单例设计模式能完美解决这个问题,所有对文件的操作都通过同一个实例进行,这样就不会产生混乱。
---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单例模式的特点
1.单例模式只有一个实例,且这个实例是自己创建的,构造方法私有化。
2.为其他类提供获得单例类的静态方法。
------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
单例模式实现方式
1.懒汉式
懒汉式单例模式的特点是获得类的对象时判断是否已经存在对象,若存在直接返回对象,若不存在,在创建对象并返回对象。其特点时加载时间快,但是运行时比较慢。
懒汉式实现代码:
- public class Singleton {
- private static Singleton instance=null;
- public synchronized static Singleton getInstance() {
- if(instance==null) {
- instance=new Singleton();
- }
- return instance;
- }
- private Singleton() {
- System.out.println("这是单例设计模式懒汉式");
- }
- }
懒汉式只有外部对象第一次请求实例才去创建。
饿汉式:饿汉式单例模式在类加载时就开始创建对象,其特点是加载时间长,但是运行速度快。
饿汉式代码:
- public class HungerySingleton {
- private static final HungerySingleton instance=new HungerySingleton();
- private HungerySingleton() {
- System.out.println("这是饿汉式单例模式");
- }
- public static HungerySingleton getInstance() {
- return instance;
- }
- }
------------------------------------------------------------------------------------------------------------------------------------------------------------
我们注意到懒汉式单例模式使用了synchronized关键字,目的是为了在同一时间只能有一个线程对该方法进行访问,避免多个线程访问该方法产生多个实例。
而饿汉式在类加载时就完成了初始化,所以对外部的获取实例的接口方法没有使用synchronized关键字修饰。
----------------------------------------------------------------------------------------------------------------------------------------------------------------
枚举类型单例设计模式
实现简单,线程安全,任何情况下都是一个单例,无偿提供序列化机制,绝对防止多次实例化,即使面对复杂的序列化或者反射攻击时。
实现代码:
- public enum SingletonEnum {
- himself;
- private Connection con=null;
- private SingletonEnum(){
con=new Connection();- }
- public Connection getConnection(){
return con;
}
- }
调用方法:SingletonEnum.himself.doingSomething();
java singleton(单例设计模式)的更多相关文章
- Java基础 static限定符的使用 以及【 static实现的 singleton(单例)设计模式】
static实现的 singleton(单例)设计模式 /** static实现的 singleton设计模式 , 使得一个类只能够创建一个static对象 */ 模板设计结构: package Co ...
- java的单例设计模式
java的单例设计模式包括:饿汉设计模式和懒汉设计模式: 步骤: 1.创建一个对象把他设置为私有的成员变量,保证唯一 2.私有构造方法,防止new一个对象. 3.定义一个公开的静态方法,返回第一步创建 ...
- Java 之单例设计模式
设计模式: 对问题行之有效的解决方式, 其实它是一种思想. 单例设计模式 解决的问题:就是可以保证一个类在内存中的对象唯一性. 即单个实例. 比如对于A 和 B 两个程序使用同一个配置信息对象时, A ...
- Java中如果把构造方法也私有化,如何创建对象?Java的单例设计模式——饿汉式和懒汉式区别
Java的单例模式——饿汉式 package com.swift; //Java单例设计模式——恶汉式 public class SinglePerson { private String name= ...
- 【设计模式】Java之单例设计模式
1.单例设计模式:一个类只能有一个对象 1.1 创建单例类的步骤: 1.将构造方法私有化 2.创建私有的静态成员变量 3.共有的静态成员方法,提供当前的唯一对象 1.1 创建单例的两种方式: 1.饿汉 ...
- 【Java】单例设计模式
文章目录 单例设计模式 什么是设计模式 单例设计模式 实现 饿汉式 懒汉式 饿汉式与懒汉式的区别 饿汉式 懒汉式 单例模式的应用场景 单例设计模式 什么是设计模式 设计模式是在大量的实践中总结和理论化 ...
- 【14】-java的单例设计模式详解
预加载模式 代码: public class Singleton { private volatile static Singleton singleton = new Singleton(); pr ...
- java之单例设计模式
什么是设计模式? 设计模式是在大量的实践中总结和理论化之后优选的代码结构.编程风格.以及解决问题的思考方式.设计模式就像是经典的棋谱,不同的棋局,我们用不同的棋谱,免去我们自己再思考和探索. 所谓单例 ...
- java基础——单例设计模式(懒汉式)
public class Test7 { // 主函数 public static void main(String[] args) { Test7.getInstance().function(9, ...
随机推荐
- LeetCode 541. 反转字符串 II(Reverse String II)
541. 反转字符串 II 541. Reverse String II
- 牛客挑战赛33 B-鸽天的放鸽序列
也许更好的阅读体验 \(\mathcal{Description}\) 定义一个长为\(n\)的\(01\)序列\(A_1, A_2, \dots, A_n\)的权值为\(\sum_{i=1}^n ...
- JavaScript中数组的key-value在对象中倒装的妙用
对于数组的去重.寻找指定元素的索引,通常我们都是通过遍历来解决,但是在某些应用场景下,将数组的value-key进行倒装,也即将value当做对象的key,key当做对象value,可以极大降低算法的 ...
- 聊一聊,React开发中应该规避的点
原文永久链接: https://github.com/AttemptWeb..... 下面说到的React开发中注意的问题,部分是自己遇到过的点,部分是收集的,也算是React代码优化部分,这次做一个 ...
- 斐波那契数列(递归)c#
我郑重宣布 我爱递归 我自己编程几乎都没用过递归 我看到这个题的时候虽然想到了用递归 但是我个脑残一直在想怎么设置动态数组 明明纯递归更简单 我也是可无语 反正我爱上递归了 爱惹 无法自拔
- serviceBehaviors_dataContractSerializer_maxItemsInObjectGraph 关键**Behavior
<behaviors> <serviceBehaviors> <behavior name="STHotel.Product.WCFService.HotelP ...
- grep过滤日志
A -B -C 后面都跟阿拉伯数字 -A是显示匹配后和它后面的n行. -B是显示匹配行和它前面的n行. -C是匹配行和它前后各n行. 总体来说,-C覆盖面最大.用它保险些.哈哈.这3个开关都是关于匹配 ...
- 【转载】 C#中List集合使用First()方法获取第一个元素
在C#的List集合操作过程中,如果要获取List集合中的第一个元素对象,则一般会先通过获取到list[0]这种方式来获取第一个元素.其实在List集合中提供了获取最后一个元素的First()方法,调 ...
- 移动Web深度剖析
随着前端技术的急速发展,随着互联网行业的日益发展,HTML5作为一种比较新型的开发技术早已经被很多大的企业所应用,通过HTML5语言可以开发适用于任何设备上的酷炫网站页面,所以HTML5的发展趋势可想 ...
- Unity3D如何接入第三方的SDK - iOS篇
来源:http://blog.csdn.net/smlisi2/article/details/8786485 授人以鱼,不如授人以渔”,以UNITY3D调用iOS版的91SDK为例,利用C# / C ...