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, ...
随机推荐
- 92. 反转链表 II
反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明: 1 ≤ m ≤ n ≤ 链表长度. 示例: 输入: 1->2->3->4->5->NULL, m ...
- Delphi 将视频 Base64 字符串转换为视频二进制文件
var Bytes: TBytes; Stream: TBytesStream; begin with System.NetEncoding.TBase64Encoding.Create do try ...
- xorm-Iterate/Count/Rows方法实例
package main import ( "fmt" _ "github.com/go-sql-driver/mysql" "github.com/ ...
- vue --- axios拦截器+form格式请求体
在vue2.x中使用CLI生成的模板有很大改变,需要自己手动在main.ts同级目录下新建interceptors.ts interceptors.ts import axios from 'axio ...
- springboot 2.1.3.RELEASE添加filter,servlet源码学习
Servlet规范中,通过ServeltContext来注册Filter.Servlet,这里分析Filter,Servlet是相同逻辑 springboot2.0中,我们通过 FilterRegis ...
- 解决Windows10关闭UAC后,开机启动项不生效的问题
Windows10关闭UAC后,会发现启动项不生效. 运行输入gpedit.msc打开组策略(家庭版没有组策略功能) 依次展开计算机配置->Windows设置->安全设置->本地策略 ...
- .net语音播放,自定义播报文字
// using System.Speech.Synthesis; SpeechSynthesizer synth = new SpeechSynthesizer(); // Configure th ...
- 深入理解JVM(一) -- 自动内存管理机制
Java运行时数据区域分为:程序计数器,虚拟机栈,本地方法栈,Java堆,方法区,运行时常量池,直接内存,结构如下: 1.程序计数器: 是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示 ...
- iOS - WebRTC的实现原理
再简单地介绍一下webrtc: WebRTC,名称源自网页实时通信(Web Real-Time Communication)的缩写,简而言之它是一个支持网页浏览器进行实时语音对话或视频对话的技术. 它 ...
- 行内块inline-block元素之间出现空白间隙原因及解决办法
首先,来看下具体的问题,下面是用inline-block布局实现的两边固定宽度,中间自适应的html代码: 1 2 3 4 5 6 7 8 9 <section class="layo ...