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设计模式之单例模式(七种方法)
单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...
随机推荐
- Leetcode44. 通配符匹配(动态规划)
44. 通配符匹配 动态规划 \(f_{i,j}\)为\(s\)匹配\(i\),\(t\)匹配\(j\)是否成功 贪心 相比之下这个思维性更强 考虑两个*,两个星号间的过渡,只需要过渡完到第二个星号, ...
- Android中进度条
<ProgressBar android:id="@+id/progress_bar" android:layout_width="match_parent&quo ...
- Function.apply.bind()与Function.apply.bind()
1.Function.apply.bind(…) 我在学习promise部分的时候遇到了这样的代码: Promise.resolve([10,20]).then(Function.apply.bind ...
- redis渐进式 rehash
转载(http://redisbook.com/preview/dict/incremental_rehashing.html) 上一节说过, 扩展或收缩哈希表需要将 ht[0] 里面的所有键值对 r ...
- 2018-2019-2 《网络对抗技术》Exp7 网络欺诈防范 20165326
网络欺诈防范 实践内容 本实践的目标理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法.具体实践有 简单应用SET工具建立冒名网站 ettercap DNS spoof 结合应用两种技术, ...
- postman_
form-data 相当于Content-Type:multipart/form-data;它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开.既可以上传键值对,也可以上传文件. x-www- ...
- Go 随机打乱 字符串 数组
func Random(strings []string) string { for i := len(strings) - 1; i > 0; i-- { num := rand.Intn(i ...
- MYSQL | ERROR 1305(42000) SAVEPOINT *** DOES NOT EXIST
autocommit模式:在开启情况下,对于每条statement来说,都会自动形成一个commit,也就是会即时对开始和结束一个事务.所以,当出现rollback to savepoint出现这个错 ...
- Android分区解释
让我们从Android手机和平板电脑的标准内存分区列表开始.分区有:/boot/system/recovery/data/cache/misc 此外,有SD卡的分区./sdcard/sd-ext 请注 ...
- sourceinsight4 用设置
通用设置Options - File Type Options: 显示行号:勾选Show line mumbers选中自动高亮:勾选Hightlight references to selected ...