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, ...
随机推荐
- python基础(三)-- 文件操作
一. 文件操作: 对文件操作流程 1.打开文件,得到文件句柄并赋值给一个变量 2.通过句柄对文件进行操作 3.关闭文件 现有文件如下 : Somehow, it seems the love I kn ...
- python 数据库导入excel
import MySQLdb import xlwt def outMySQL(file_name): wb = xlwt.Workbook() sh = wb.add_sheet('sheet 1' ...
- 【转帖】处理器史话 | 这张漫画告诉你,为什么双核CPU能打败四核CPU?
处理器史话 | 这张漫画告诉你,为什么双核CPU能打败四核CPU? https://www.eefocus.com/mcu-dsp/371324 2016-10-28 10:28 作者:付丽华预计 9 ...
- Java开发笔记(一百四十一)JavaFX的列表与表格
下拉框只有在单击时才会弹出所有选项的下拉列表,这固然节省了有限的界面空间,但有时候又需要把所有选项都固定展示到窗口上.像这种平铺的列表控件,Swing给出的控件名称是ListBox,而JavaFX提供 ...
- laravel迁移文件中字段方法对应的数据库类型
/* *Blueprint类中的方法方法 <-> 数据库数据类型 * */ // 数字 increments();// int(10) unsigned primarykey auto_i ...
- 模块 logging random
模块logging logging模块的主要功能是记录软件调试.操作过程中的各种日志. 默认情况下Python的logging模块将日志打印到了标准输出中,且只显示了大于等于WARNING级别的日志, ...
- TensorFlow学习笔记(1)—— 基本概念与框架
入门框架时的常见问题 学习框架的原因? 方便.易用 学习框架的哪些知识点? 掌握一个项目的基本流程,就知道需要学习哪些知识点了 迅速学习框架的方法 根据项目每块流程的需要针对性的学 可以看官方的入门教 ...
- Linux下使用ip netns命令进行网口的隔离和配置ip地址
1. 添加隔离标记符: ip netns add fd 2. 将指定网卡放入隔离中: ip link set eth1 netns fd 3. 在隔离环境下执行命令: ip netns exec fd ...
- mysql中sum与if,case when 结合使用
1.sum与if结合使用 如图:数据表中,count_money 字段可为正,可为负.为正表示收入,负表示支出. 统计总收入,总支出. select sum(if(count_money > 0 ...
- 使用 Angular RouteReuseStrategy 缓存(路由)组件
使用 Angular RouteReuseStrategy 缓存组件 Cache components with Angular RouteReuseStrategy RouteReuseStrate ...