设计模式第六讲:单例模式(附优化方案)

单例模式

一:模式定义

一个类有且仅有一个实例,并且自行实例化向整个系统提供。

二:模式特点

通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系统资源。

三:使用场景

希望在系统中某个类的对象只能存在一个。

四:具体实现

单例模式有两种写法:

1.懒汉式

2.饿汉式

懒汉式实现:

public class Single {
    private static Single instance;
    private Singleton (){}

   public static Single getInstance() {
	if (instance == null) {
	    instance = new Single();
	}
	return instance;
    }
}

懒汉式的特点式,实例的对象是在用到的时候才创建,这样就会导致线程不安全,因为如果有两个线程同时getInstance()就有可能创建出来两个实例,破坏了单例的特性。

懒汉式改进实现:

public class Single {
    private static Single instance;
    private Single(){}
    public static synchronized Single getInstance() {
	if (instance == null) {
	    instance = new Single();
	}
	return instance;
    }
}

加入同步锁,在多线程下可以很好地工作

饿汉式实现:

public class Single {
    private static Singlet instance = new Singlet();
    private Single(){}
    public static Single getInstance() {
	return instance;
    }
}

饿汉式的实现,是利用了classloader机制,在类加载的时候既完成了实例化,这样就不存在多线程的安全问题了,但是这种预加载,也有占用系统大量资源的风险。

以上的两种实现方法,无论哪种,都会存在一定的缺点,下面来做一下优化,使得兼具两种形式的优点:

public class Singlet {
    private static class SingleHolder {
	private static final Single INSTANCE = new Single();
    }
    private Single (){}
    public static final Single getInstance() {
	return SingleHolder.INSTANCE;
    }
}

这种实现方式,既可以实现多线程的安全,也可以实现使用时才加载的要求,因为其内部的SingleHolder静态类在Singlet加载的时候并不会加载,只有在使用getInstance()才会触发加载。

设计模式第六讲:单例模式(附优化方案)

时间: 2024-08-29 00:30:46

设计模式第六讲:单例模式(附优化方案)的相关文章

逆向知识第六讲,取摸优化的几种方式

逆向知识第六讲,取摸优化的几种方式 除法讲完之后,直接开始讲 % 运算符在汇编中表现形式 首先C的高级代码贴上来. 高级代码: // Tedy.cpp : Defines the entry point for the console application. // #include "stdafx.h" int main(int argc, char* argv[]) { unsigned Number; scanf("%d",&Number); //防止

设计模式(六):单例模式

一.概述 单例模式确保一个类只有一个实例,并提供一个安全的访问点. 二.解决问题 从概述中我们知道,单例模式就是保证系统的一个类只有一个实例.它的作用就是控制受限资源的访问,确保任何时刻都只有一个线程在访问一个受保护的资源.或者确保行为和状态的一致性,避免异常行为.在java web的程序中可能用到最多单例的地方就是jdbc的线程池. 三.结构类图 四.成员角色 实例变量(uniqueInstance):持有唯一的单例实例,静态私有访问权限,只有本类才能访问该实例变量. 全局访问方法(getIn

五、测试-六、优化方案

五.测试 1.单元测试 单元测试的方式是黑盒测试,即通过每个环节的输入输出情况进行测试.程序由四个类组成,对应生成四个测试类,使用Junit5对其中的主要方法进行测试.测试的大致思路是预先设计较为简单的数独用例,生成新的对象,运行方法,并将阶段性的结果与预先计算的结果相比较. 有些方法具有返回值,便于设计测试类,例如对 Main::isNumber()进行测试: //Main::isNumber public static boolean isNumber(String str){ String

史上最详细nodejs版本管理器nvm的安装与使用(附注意事项和优化方案)

使用场景 在Node版本快速更新迭代的今天,新老项目使用的node版本号可能已经不相同了,node版本更新越来越快,项目越做越多,node切换版本号的需求越来越迫切,传统卸载一个版本在安装另一个版本的方式太过于麻烦,这也是nvm能够流行的原因. 下载nvm 打开下载地址:https://github.com/coreybutler/nvm-windows/releases 选择1.1.5最终发布版,比较稳定,或者选择预发行版本1.1.6,根据个人的喜欢,本人使用的是1.1.6的,目前没有遇到任何

Adapter优化方案的探索

概要:使用Adapter的注意事项与优化方案本文的例子都可以在结尾处的示例代码连接中看到并下载,如果喜欢请star,如果觉得有纰漏请提交issue,如果你有更好的点子可以提交pull request.本文的示例代码主要是基于CommonAdapter这个库编写的,若你有其他的技巧和方法可以参与进来一起完善这篇文章.固定连接:https://github.com/tianzhijiexian/Android-Best-Practices/blob/master/2015.10/adapter/ad

前端性能优化方案

前端开发性能优化方案 在JS中尽量减少闭包的使用(原因:闭包会产生不释放的栈内存) A:循环给元素做事件绑定的时候,尽可能的把后期需要的信息(例如索引)存储到元素的自定义属性上,而不是创建闭包存储 B:可以在最外层形成一个闭包,把一些后续需要的公共信息进行存储,而不是每一个方法都创建闭包(例如单例模式) C:尽可能的手动释放不被占用的内存 ... 尽量合并CSS和JS文件(把需要引入的CSS合并为一个,JS也是合并为一个),原理是在减少HTTP请求次数,尽可能的把合并后的代码进行压缩,减小HTT

mysql 性能优化方案 (转)

网 上有不少MySQL 性能优化方案,不过,mysql的优化同sql server相比,更为麻烦与复杂,同样的设置,在不同的环境下 ,由于内存,访问量,读写频率,数据差异等等情况,可能会出现不同的结果,因此简单地根据某个给出方案来配置mysql是行不通的,最好能使用 status信息对mysql进行具体的优化. mysql> show global status; 可以列出mysql服务器运行各种状态值,另外,查询mysql服务器配置信息语句: mysql> show variables; 一

[转] 钉钉的H5性能优化方案

对于一个H5的产品,功能无疑很重要,但是性能同样是用户体验中不可或缺的一环.原本H5的渲染性能就不及native的app,如果不把性能优化做起来,将极大地影响用户使用产品的积极性. 用户感受 当用户能够在1-2秒内打开H5页面,看到信息的展示,或者能够开始进行下一步的操作,用户会感觉速度还好,可以接受:而页面如果在2-5秒后才进入可用的状态,用户的耐心会逐渐丧失:而如果一个界面超过5秒甚至更久才能显示出来,这对用户来说基本是无法忍受的,也许有一部分用户会退出重新进入,但更多的用户会直接放弃使用.

16位汇编第六讲汇编指令详解第二讲

16位汇编第六讲汇编指令详解第二讲 1.比较指令 CMP指令 1.CMP指令是将目的操作数减去源操作数,按照定义相应的设置状态标志 2.CMP指令执行的功能与SUB指令(相减指令)一样,但是不同的是CMP指令之根据结果设置标志位 而不修改值 可以操作的指令格式 CMP reg,imm/reg/mem CMP mem,imm/reg 上面是CMP指令的语法,具体的也可以查询帮助文档,inter手册 inter手册查的办法 第一个框代表了CMP指令的所有语法 比如 reg,reg 表示可以比较寄存器