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, ...
随机推荐
- win10无法安装软件解决
https://www.windowscentral.com/how-fix-network-resource-unavailable-install-error-windows-10
- 【程序人生】Oracle正式公布裁员,1600人,补偿N+6
早些时候Oracle内部员工透漏,Oracle中国研发中心(CDC)或彻底关闭,涉及约1600名工程师的命运. 今天甲骨文正式公布裁员,整个中国研发中心关闭,补偿是全员n+6,包括北京,苏州,南京,上 ...
- python基础 — 致初学者的天梯
Python简介 Python是一种计算机程序设计语言.是一种面向对象的动态类型语言,最初被设计用于编写自动化脚本(shell),随着版本的不断更新和语言新 功能的添加,越来越多被用于独立的.大型项目 ...
- 『Go基础』第6节 注释
在上一节中, 我们学会了怎样写一个 Hello Go . 但是, 大家有可能还没有明白为什么那么写, 下面我们通过注释来了解一下. 注释的重要性不再过多赘述, 一段不写注释的代码读起来实在难受. 那么 ...
- Python3基础语法(20190617)
字符串 字符串是以单引号'或双引号"括起来的任意文本,比如'abc',"xyz"等等.请注意,''或""本身只是一种表示方式,不是字符串的一部分,因此 ...
- 深入浅出CAS
后端开发中大家肯定遇到过实现一个线程安全的计数器这种需求,根据经验你应该知道我们要在多线程中实现 共享变量 的原子性和可见性问题,于是锁成为一个不可避免的话题,今天我们讨论的是与之对应的无锁 CAS. ...
- [LOJ3086] [GXOI2019] 逼死强迫症
题目链接 LOJ:https://loj.ac/problem/3086 洛谷:https://www.luogu.org/problemnew/show/P5303 Solution 显然不考虑\( ...
- Windows MySql增量备份、完整备份采坑之路
1.前言 这周公司交给我一个任务,负责项目Mysql数据库的备份,因为项目上线后数据是一个大问题,出了什么问题数据才是最大的问题,备份这时候就显得尤为重要, 公司项目的思路是:在项目系统设置内可以勾选 ...
- Spring Boot 入门 - 目录
pring Boot 入门 - 进阶篇(3)- 定时任务(@Scheduled) 主要用于定时发送邮件.夜间自动维护等. (1)开启定时任务功能 @Configuration @EnableSched ...
- VisualStudio 连接 MySql 实现增删查改
首先创建数据库,建立一个用户登录表 2.visualStudio默认是不支持MySql的,要想通过Ado.Net 操作MySql 需要在管理NeGet包添加对MySql.Data 和 MySql.D ...