java设计模式(一)——单例模式
1、基本介绍
单例设计模式,就是采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,
并且该类只提供-一个取得其对象实例的方法(静态方法)。如:一般情况下,数据库的连接
2、创建方式:
1)饿汉式(静态常量)
2)饿汉式 (静态代码块)
3)懒汉式(线程不安全)
4)懒汉式(线程安全, 同步方法)
5)懒汉式(线程不安全, 同步代码块)
6)双重检查
7)静态内部类
8)枚举
2.1、饿汉式(静态常量)
class Singleton { private final static Singleton1 singleton = new Singleton(); private Singleton(){} public static Singleton getInstance(){
return singleton;
}
}
优缺点:
1) 优点:这种写法比较简单,就是在类装载的时候就完成实例化。避免了线程同步问题。
2)缺点: 在类装载的时候就完成实例化,没有达到Lazy Loading的效果。如果从始至终从未使用过这个实例,则
会造成内存的浪费
3)这种方式基于classloder机制避免了多线程的同步问题,不过,instance 在类装载时就实例化,在单例模式中大
多数都是调用getInstance方法,但是导致类装载的原因有很多种,因此不能确定有其他的方式(或者其他的静
态方法)导致类装载,这时候初始化instance就没有达到lazy loading的效果
4)结论: 这种单例模式可用,可能造成内存浪费
2)饿汉式 (静态代码块)
class Singleton { private static Singleton singleton; static {
singleton = new Singleton();
}
private Singleton(){} public static Singleton getInstance(){
return singleton;
}
}
使用静态块的方式在类加载的时候实例化,优缺点和上面一样
2.3、懒汉式(线程不安全)
class Singleton { private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
优缺点:
1) 起到了Lazy Loading的效果,但是只能在单线程下使用。
2)如果在多线程下, - 一个线程进入了if (singleton = null)判断语句块,还未来得及往下执行,另一个线程也通过
了这个判断语句,这时便会产生多个实例。所以在多线程环境下不可使用这种方式
3) 结论:在实际开发中,不要使用这种方式.
2.4、懒汉式(线程安全, 同步方法)
class Singleton { private static Singleton singleton; private Singleton(){} public static synchronized Singleton getInstance(){
if(singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
优缺点:
1)解决了线程安全问题
2)效率太低了, 每个线程在想获得类的实例时候,执行getlnstance(方法都要进行同步。而其实这个方法只执行
一次实例化代码就够了,后面的想获得该类实例,直接return就行了。方法进行同步效率太低
3)结论: 在实际开发中,不推荐使用这种方式
5)懒汉式(线程不安全, 同步代码块)
class Singleton { private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton == null) {
synchronized (Singleton.class){
singleton = new Singleton();
}
}
return singleton;
}
}
不推荐使用
2.6、双重检查
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;
}
}
volatile:1》当主内存的值更新后,就可以立即更新到工作内存中,保证可见性,避免后来的线程等待
2》还可以防止指令重排。
优缺点:
1) Double-Check 概念是多线程开发中常使用到的,如代码中所示,我们进行了两次if (singleton == null)检查,这
样就可以保证线程安全了。
2)这样, 实例化代码只用执行一次,后面再次访问时,判断if (singleton == nul),直接return实例化对象,也避
免的反复进行方法同步.
3)线程安全; 延迟加载;效率较高
4)结论: 在实际开发中,推荐使用这种单例设计模式
2.7、静态内部类
class Singleton { private static Singleton singleton; private static class SingletonInstance{
//声明一个静态属性
private static final Singleton SINGLETON = new Singleton();
} public static Singleton getInstance(){
return SingletonInstance.SINGLETON;
}
}
优缺点:
1) 这种方式采用了类装载的机制来保证初始化实例时只有-一个线程。
2)静态内部类方式在Singleton类被装载时并不会立即实例化,而是在需要实例化时,调用getlnstance方法,才
会装载SingletonInstance类,从而完成Singleton的实例化。
3)类的静态属性只会在第一-次加载类的时候初始化,所以在这里,JVM帮助我们保证了线程的安全性,在类进行
初始化时,别的线程是无法进入的。
4)优点:避免了线程不安全,利用静态内部类特点实现延迟加载,效率高
5)结论: 推荐使用.
2.8、枚举
enum Singleton{
INSTANCE;
}
优缺点:
1)不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象。,避免反射带来的问题。
2)结论: 推荐使用
java设计模式(一)——单例模式的更多相关文章
- java 设计模式之单例模式
-------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...
- 折腾Java设计模式之单例模式
博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...
- Java设计模式之单例模式(七种写法)
Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...
- Java 设计模式之单例模式(一)
原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...
- java设计模式1——单例模式
java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...
- java设计模式之单例模式你真的会了吗?(懒汉式篇)
java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...
- java设计模式之单例模式(几种写法及比较)
概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...
- java设计模式- (1)单例模式
参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...
- [转]JAVA设计模式之单例模式
原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...
- java设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- C语言 选择排序算法原理和实现 从数组中 找出最小的元素然后交换位置
#include <stdio.h> int main(void) { /* 选择排序算法 原理:从数组中 找出最小的元素然后交换位置: */ int a[10] = {9,5,10,7, ...
- Cogs 2546. 取石块儿(博弈)
取石块儿 ★ 输入文件:tstones.in 输出文件:tstones.out 简单对比 时间限制:1 s 内存限制:256 MB 问题描述 小L和小T进行取石块儿游戏,给定一个整数n表示石块儿总数, ...
- sed、awk命令速查
awk与sed.grep一样都是为了加工数据流而做成的文本加工过滤器命令.awk会事先把输入的数据根据字段单位进行分割.在没有指定分割单位的情况下,以输入数据中的空格或Tab为分隔符.与sed相比,它 ...
- NOIP前做题记录
鉴于某些原因(主要是懒)就不一题一题写了,代码直接去\(OJ\)上看吧 CodeChef Making Change 传送门 完全没看懂题解在讲什么(一定是因为题解公式打崩的原因才不是曲明英语太差呢- ...
- GoCN每日新闻(2019-09-27)
1. Golang新版本发布:Go 1.13.1和Go 1.12.10https://golang.org/dl/ 2. 如何在Golang中使用Websockets:最佳工具和步骤指南 https: ...
- Oracle导出/导入数据库的三种模式
导出 模式一:全量导出(慎用) exp 用户名/密码@数据库实例 owner=用户名 file=文件存储路径 log=日志存储路径 full=y 栗子:exp Mark/123456@151.2.*. ...
- spring线程池的同步和异步(1)
spring线程池(同步.异步) 一.spring异步线程池类图 二.简单介绍 2.1. TaskExecutor---Spring异步线程池的接口类,其实质是java.util.concurrent ...
- CMU Database Systems - Query Processing
Query Model Query处理有三种方式, 首先是Iterator model,这是最基本的model,又称为volcano,pipeline模式 他是top-down的模式,通过next函数 ...
- Tosca 添加插件或者是扩展功能,把页面上某块内容识别成table
#遇到了问题 "ICS table was not found" 是因为编辑case的时候用到了插件的功能, 但是setting里面却没有配置这个插件 #在哪里添加插件 #目的 这 ...
- vim支持golang函数调整
golang函数跳转需要借助godef实现 godef安装如下 go get -v github.com/rogpeppe/godef go install -v github.com/rogpepp ...