单例模式(懒汉、饿汉、同步锁、static、枚举)实现
使用前提:
需要频繁的进行创建和销毁的对象,创建对象时耗时过多或耗费资源过多
三要素:
- 1、构造方法私有化;
- 2、实例化的变量引用私有化;
- 3、获取实例的方法共有。
1.饿汉式单例
弊端:在类装载的时候就完成实例化
/**
* 饿汉式单例
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午9:55:32
* @version 1.0
*/
public class Singleton1 {
private Singleton1() {
}// 1私有化构造 private final static Singleton1 singleton1 = new Singleton1();// 2实例化 public static Singleton1 getInstance() {// 3对外提供
return singleton1;
} }
2.懒汉式单例
弊端:多线程环境下会产生多个single对象,线程不安全
/**
* 懒汉式单例
* 多线程环境下会产生多个single对象
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午10:17:59
* @version 1.0
*/
public class Singleton2 {
private Singleton2() {
}// 1私有化构造 private static Singleton2 singleton2 = null;// 延迟实例 public static Singleton2 getInstance() {
if (singleton2 == null) {
singleton2 = new Singleton2();
}
return singleton2;
}
}
3.懒汉式单例(synchronized同步锁)
弊端:效率低
同步方法的方式:获取实例时,每次都要执行同步方法,效率太低
同步代码块的方式:可能多个线程同时进入if判断,实际页无法起到线程同步的作用
/**
* 懒汉式单例 只对需要锁的代码部分加锁
*
* @author Wonder
* @history create Wonder 2018年10月24日 上午10:17:59
* @version 1.0
*/
public class Singleton4 {
private Singleton4() {
}// 1私有化构造 private static Singleton4 single = null;// 延迟实例 public static Singleton4 getInstance() {
if (single == null) {
synchronized (Singleton4.class) {
single = new Singleton4();
}
}
return single;
}
}
4.双重检查
1.使用volatile关键字,防止防止 JVM 进行指令重排优化
2.进行了两次if (singleton == null)检查,如果为null,同步代码块,创建实例,否则直接返回singleton实例
public class Singleton {
private static volatile Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
5.静态代码块和静态内部类
静态代码块的方式
public class Singleton5 {
private Singleton5() {
}// 1私有化构造
private static Singleton5 single = null;// 延迟实例
// static静态代码块
static {
single = new Singleton5();
}
public static Singleton5 getInstance() {
return single;
}
}
静态内部类方式更优(懒加载)
静态内部类方式在Singleton类被装载时并不会立即实例化
public class Singleton {
private Singleton() {}
private static class SingletonInstance {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonInstance.INSTANCE;
}
}
6.枚举实现
简单枚举方式:
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
优化:内部枚举类
public class SingletonFactory {
// 内部枚举类
private enum EnmuSingleton {
SINGLETON;
private Singleton6 single;
// 枚举类的构造方法在类加载是被实例化
private EnmuSingleton() {
single = new Singleton6();
}
public Singleton6 getInstance() {
return single;
}
}
public static Singleton6 getInstance() {
return EnmuSingleton.SINGLETON.getInstance();
}
}
class Singleton6 {
public Singleton6() {
}
}
单例模式(懒汉、饿汉、同步锁、static、枚举)实现的更多相关文章
- java 设计模式 单例模式之饿汉模式/懒汉模式 singleton pattern
https://v.qq.com/x/page/e0364ung5zp.html 讲的不错, 关于 饿汉式单例模式 code Student 类: package com.test;//单例模式之 ...
- C++的单例模式与线程安全单例模式(懒汉/饿汉)
1 教科书里的单例模式 我们都很清楚一个简单的单例模式该怎样去实现:构造函数声明为private或protect防止被外部函数实例化,内部保存一个private static的类指针保存唯一的实例,实 ...
- Java单例模式之饿汉模式与懒汉模式
单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...
- javascript单例模式(懒汉 饿汉)
第一种:懒汉模式 var Singleton=(function(){ var instantiated; //比较懒,在类加载时,不创建实例,因此类加载速度快,但运行时获取对象的速度慢 functi ...
- java单例,懒汉&饿汉
* 单例模式Singleton * 应用场合:有些对象只需要一个就足够了,如皇帝 * 作用: 保证整个应用程序中某个实例有且只有一个 * 区别: 饿汉模式的特点是加载类时比较慢,但运行是比较快 ...
- java基础---Java---面试题---银行业务调度系统(线程同步锁、枚举、线程池)
银行业务调度系统的项目需求: 模拟实现银行业务调度系统逻辑,具体需求如下: Ø 银行内有6个业务窗口,1- 4号窗口为普通窗口,5号窗口为快速窗口,6号窗口为VIP窗口. Ø 有三种对应类 ...
- java基础10 单例模式之饿汉式和懒汉式单例
前言: 软件行业中有23中设计模式 单例模式 模版模式 装饰者模式 观察者模式 工厂模式 ........... 单例模式 1. 单例模式包括 1.1 饿汉式单例 1.2 ...
- java单例模式(饿汉式和懒汉式)
1 /* 2 * 设计模式:对问题行之有效的解决方式.其实它是一种思想. 3 * 4 * 1,单例设计模式 5 * 解决的问题:就是可以保证一个类在内容中的对象唯一性. 6 * 7 * 必须对于多个程 ...
- Java面试题之在多线程情况下,单例模式中懒汉和饿汉会有什么问题呢?
懒汉模式和饿汉模式: public class Demo { //private static Single single = new Single();//饿汉模式 private static S ...
- Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式
链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...
随机推荐
- pacman安装软件包出现损坏
状况 File .pkg.tar.xz is corrupted (invalid or corrupted package (PGP signature)).Do you want to delet ...
- StringTokenizer 的性能看来真的不用担心
一直以来,分析HTTP的Header使用的都是StringTokenizer,但是看过jdk中关于StringTokenizer的介绍: StringTokenizer 是出于兼容性的原因而被保留的遗 ...
- dijkstra(最短路)和Prim(最小生成树)下的堆优化
dijkstra(最短路)和Prim(最小生成树)下的堆优化 最小堆: down(i)[向下调整]:从第k层的点i开始向下操作,第k层的点与第k+1层的点(如果有)进行值大小的判断,如果父节点的值大于 ...
- 上传znbsite
1.将本地文件打包为zip: 2.备份服务器上的classes文件夹下面的配置文件: 3.上传zip,释放到tomcat下: 4.覆盖classes文件夹中的配置文件,启动tomcat:
- [持续更新] 文章列表 Last Update: 8/21/2017
1.前端 HTML5快速学习二 Canvas@20141125 HTML5快速学习一@20141122 2.ASP.NET(MVC) MVC5+EF6 完整教程17--升级到EFCore2.0@201 ...
- ADO.NET入门教程(五) 细说数据库连接池
摘要 今天我要讲的是数据库连接池.说实话,我表示鸭梨很大.因为相比其他章节来说,连接池相对来说难理解一点.我要用最通俗的语句给大家讲明白,讲透彻却也不是一件很容易的事.但是,连接池又是非常重要的知识点 ...
- P5002 专心OI - 找祖先
P5002 专心OI - 找祖先 给定一棵有根树(\(n \leq 10000\)),\(M \leq 50000\) 次询问, 求以 \(x\) 为 \(LCA\) 的点对个数 错误日志: 看下面 ...
- 通过Cloudera Manager部署CDH5.15.1的webUI界面详解
通过Cloudera Manager部署CDH5.15.1的webUI界面详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 本篇博客CDH的部署完全通过Cloudera Mana ...
- 设计模式---对象创建模式之原型模式(prototype)
一:概念 原型模式(Prototype Pattern) 实际上就是动态抽取当前对象运行时的状态 Prototype模式是一种对象创建型模式,它采取复制原型对象的方法来创建对象的实例.使用Protot ...
- Ubuntu(16.04.2)学习笔记(一)如何解决dpkg: error processing install-info
一.服务器安装软件是出现以下的错误信息: www@TinywanAliYun:~$ sudo apt-get install letsencrypt Reading package lists... ...