### 1. 概述
> 单例模式是确保某一个类中有且只有一个实例。

----------
### 2. 饿汉式单例
``` java
public class SingletonInstance {
private static SingletonInstance mInstance = new SingletonInstance();
// 默认私有构造方法
private SingletonInstance(){}
// 静态工厂方法
public static SingletonInstance getInstance(){
return mInstance ;
}
}
```
在饿汉式单例中,静态变量会在私有构造方法中初始化,这时候唯一的实例就被创建出来了,饿汉式主要使用到的是**空间换时间**的思想,在类还在加载的时候,对象实例便已经创建好了。

----------

### 3. 懒汉式单例
```java
public class SingletonInstance {
private static SingletonInstance mInstance = null;
// 私有默认构造方法
private SingletonInstance(){}
// 静态工厂方法
public static synchronized SingletonInstance getInstance(){
if(mInstance == null){
mInstance = new SingletonInstance();
}
return mInstance;
}
}
```
对于懒汉式单例的处理,使用了``synchronized``参数修饰工厂方法,用来在多线程环境中解决同步问题,懒汉式主要是使用到的是**时间换空间**的思想,在获取实例的时候进行判断,只有在需要的时候才去创建对象,节省内存空间,但是缺点就是实现的方式是线程安全的,这样会降低访问的速度。

----------
### 4. 双重加锁单例
```java
public class SingletonInstance {
private volatile static SingletonInstance mInstance = null;
private SingletonInstance(){}
public static SingletonInstance getInstance(){
//先检查实例是否存在,如果不存在才进入下面的同步块
if(mInstance == null){
//同步块,线程安全的创建实例
synchronized (SingletonInstance .class) {
//再次检查实例是否存在,如果不存在才真正的创建实例
if(mInstance == null){
mInstance = new SingletonInstance ();
}
}
}
return mInstance;
}
}
```
双重加锁机制指的是,在每次进入``getInstance``方法先不同步,而是进入方法后,先检查实例是否存在,如果不存在才进行下面的同步块,这属于第一重检查,进入同步块过后再检查实例是否存在,如果不存在,就在同步的情况下创建一个新的实例,这属于第二重检查。这样便只需要同步一次,并减少了在多次同步情况下进行判断浪费的时间。
这种实现方式会使用到**volatile**关键字,意思是被**volatile**修饰的变量的值,不会被本地线程缓存,所有对该变量的读写都是直接操作共享内存,从而保证线程正确的处理该变量。
> **volatile**关键字在**JDK5**之前的版本中加锁失败,注意之。而且**volatile**关键字会屏蔽掉虚拟机中的一些必要的代码优化,因此虽然能实现双重检查加锁机制的单例,但并不建议大量采用。

那有什么方案可以既能达到延迟加载,又能实现线程安全的目的呢?

-----
### 5. Lazy Initialization Holder Class模式
```java
public class SingletonInstance {

private SingletonInstance(){}
/**
* 类级的内部类的实例与外部类的实例没有绑定关系,而且只有被调用到时才会装载
*/
private static class SingletonHolder{
/**
* 静态初始化,由JVM来保证线程安全
*/
private static SingletonInstance mInstance = new SingletonInstance();
}
public static SingletonInstance getInstance(){
return SingletonHolder.mInstance;
}
}
```
如果只是想简单的实现线程安全的单例,可以使用之前的**饿汉式**方式。但是缺点就是会在类装载的时候初始化对象,造成空间的浪费。
那么只要解决了类加载时自动初始化对象的问题,便可以解决问题。因此可以采用类级内部类的方式去实现,这样的话,只有在需要的时候才会创建对象实例,也达到了延迟加载和线程安全的目的。
从实现过程来看,但调用`getInstance`方法时,它会读取`SingletonHolder.mInstance`,从而初始化,在这个类被装载的时候,也会初始化静态成员,而由于静态域的特性,只会初始化一次,并且由JVM来保证线程安全。
>- 什么是类级内部类?
被`static`修饰的成员内部类才是类级内部类,如果没有被`static`修饰则被称为对象内部类,而且类级内部类与外部类对象不存在依赖关系,只有在第一次使用的时候才会被调用。
>- 多线程默认同步锁知识?
在多线程开发中,我们主要使用`synchronized`来对互斥锁进行同步控制,但是某些情况下JVM已经为我们进行了同步控制了,主要有:
1. 静态初始化方法初始化数据时;
2. 访问`final`字段时;
3. 在创建线程之前创建对象时;
4. 线程可以看见要处理的对象时;

----------
### 6. 枚举式单例
```java
public enum SingletonInstace{
// 定义一个枚举元素,它代表了一个实例
mInstance;
// 单例的操作
public void singletonOperation(){

}
}
```
使用枚举的方式既使得代码简洁,而且也由JVM来保证序列化机制,防止多次实例化,是最佳的实现单例的方式。

转载于:https://www.cnblogs.com/dennisac/p/4734868.html

【Java设计模式】单例模式相关推荐

  1. Java 设计模式 - 单例模式

    Java 设计模式 - 单例模式 作者: 霍英俊 [huo920@live.com] 文章目录 Java 设计模式 - 单例模式 单例设计模式介绍 单例设计模式八种方式 饿汉式 - 静态常量 饿汉式( ...

  2. Java设计模式——单例模式

    单例模式 1.什么是单例模式. 2.单例设计的几种实现方式. 2.1.懒汉式 2.2.饿汉式 2.3.登记式 3.总结 4.建议 1.什么是单例模式. 确保某一个类只有一个实例,并且提供一个全局访问点 ...

  3. Java设计模式——单例模式的七种写法

    单例模式(Singleton) 单例模式(Singleton)是一种常用的设计模式.在Java应用中,单例模式能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频 ...

  4. JAVA设计模式--单例模式

    Singleton是一种创建型模式,指某个类采用Singleton模式,则在这个类被创建后,只可能产生一个实例供外部访问,并且提供一个全局的访问点. 核心知识点如下: (1) 将采用单例设计模式的类的 ...

  5. 我的Java设计模式-单例模式

    就算不懂设计模式的兄弟姐妹们,想必也听说过单例模式,并且在项目中也会用上.但是,真正理解和熟悉单例模式的人有几个呢?接下来我们一起来学习设计模式中最简单的模式之一--单例模式 一.为什么叫单例模式? ...

  6. JAVA设计模式 - 单例模式

    单例模式(Singleton)是软件设计中一种比较常见的 , 相对简单的设计模式 . 1 . 单例模式的定义 所谓单例 , 指的就是单示例 , 即某个类的实现对象有且仅能有一个 , 并提供对外调用的方 ...

  7. java设计模式—单例模式

    (一)单例模式  java中一共有23种设计模式 : 是开发人员根据不同的代码场景总结出来的不同的实现方法, 归纳为23种代码的设计方法, 单例模式就是其中的一种. 单例模式 : 在整个系统中,一个类 ...

  8. 【文末抽书】Java设计模式--单例模式

    来源 :投稿 | 作者 : gyl-coder|原文:阅读原文 在介绍单例模式之前,我们先了解一下,什么是设计模式? 设计模式(Design Pattern):是一套被反复使用,多数人知晓的,经过分类 ...

  9. java设计模式---单例模式

    关于单例模式的文章,其实网上早就已经泛滥了.但一个小小的单例,里面却是有着许多的变化.网上的文章大多也是提到了其中的一个或几个点,很少有比较全面且脉络清晰的文章,于是,我便萌生了写这篇文章的念头.企图 ...

  10. JAVA设计模式-单例模式(Singleton)线程安全与效率

    一,前言 单例模式详细大家都已经非常熟悉了,在文章单例模式的八种写法比较中,对单例模式的概念以及使用场景都做了很不错的说明.请在阅读本文之前,阅读一下这篇文章,因为本文就是按照这篇文章中的八种单例模式 ...

最新文章

  1. mysql创建函数1418_Mysql中创建函数报“ERROR 1418 ”的解决方法
  2. 安装archlinux_archlinux/manjaro 上安装percona-server
  3. 以前折腾的7zip图标
  4. SAP UI5 Gateway后台ETAG校验逻辑
  5. 一码阻塞,万码等待:ASP.NET Core 同步方法调用异步方法“死锁”的真相
  6. 这可能是你与 AI 大神们近距离接触的唯一机会……
  7. 综述 | 事件抽取及推理 (上)
  8. hadoop学习——Hadoop核心组件
  9. Android性能优化之APK瘦身最全总结
  10. c语言程序设计2试卷答案,《C语言程序设计》试卷2参考答案.doc
  11. Linux下MySQL 5.5的修改字符集编码为UTF8(彻底解决中文乱码问题)
  12. 应用程序偏好设置(转)
  13. Linux下vsftp服务器原理、安装、配置实战
  14. windows 系统 使用 redis 客户端
  15. python身份证号码解析编程_Python实现身份证号码解析
  16. 杭州电子科技大学计算机学院复试细则,2020杭州电子科技大学计算机学院考研复试公告...
  17. Chrome浏览器更新后,无法调用Lodop打印
  18. AGU13-Save The Princess
  19. LabVIEW学习分享(2)
  20. 风靡厦门的一种游戏你玩过吗?竟然发明者不是郑成功,而另有其人!

热门文章

  1. Linux守护进程简介
  2. 全世界都认为汉语是婴儿语(转载)
  3. C#字典Dictionary排序(顺序、倒序)
  4. Docker 使用Dockerfile构建tomcat镜像
  5. Protocol Buffers java
  6. 合肥将全力打造“城市超脑” 创建智慧城市典范
  7. MySQL5.7号称永久解决了复制延迟问题的并行复制
  8. mysql数据库基本操作练习
  9. Codeforces Round #375 (Div. 2)
  10. [国家集训队]墨墨的等式