单例模式(Singleton Pattren):确保一个类在整个应用中只有一个实例,并提供一个全局访问点。

实现要点:

1. 私有化构造方法

2. 类的实例在类初始化的时候创建

3. 提供一个类方法,返回值为类的实例,其他类调用该方法获取到该类的实例

1. 常规实现(线程不安全,不考虑多线程):

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

2. 线程安全懒加载实现(懒汉式):

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

3. 线程安全快速加载实现(饿汉式):

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

三种实现方法中:

第一种,假如在单线程模式下,是可以的,不会出现多个实例的情况,但是在多线程的模式下是不安全的,可能会创建多个实例。

第二种,在方法内部进行了加锁操作,同时使用 volatile 修饰 instance,防止 Java 指令重排,确保当变量 instance 被初始化成 Singleton2 实例时,多个线程正确的处理 instance 变量。该写法只有在使用的时候才会初始化对象,可以提高性能。

第三种,比较简单的写法,在类被加载的时候就初始化了对象,所以在调用的时候直接返回这个变量就可以了,线程安全由 JVM 来确保,因为 JVM 加载的时候是单线程的。不存在线程不安全的问题,但是该对象在类加载进 JVM 的时候就初始化了,会占用资源。

一种更好的写法,弥补饿汉式初始化以后不使用对象占用资源的问题,弥补懒汉式初始化过程中使用 synchronized 影响性能的问题

 public class Singleton4 {

     private Singleton4() {
} private static class Holder {
private static Singleton4 instance = new Singleton4();
} public static Singleton4 getInstance() {
return Holder.instance;
}
}

由于静态单例对象没有作为Singleton的成员变量直接实例化,因此类加载时不会实例化Singleton,第一次调用getInstance()时将加载内部类HolderClass,在该内部类中定义了一个static类型的变量instance,此时会首先初始化这个成员变量,由Java虚拟机来保证其线程安全性,确保该成员变量只能初始化一次。由于getInstance()方法没有任何线程锁定,因此其性能不会造成任何影响。

知识点: 可以写出三种单例模式,参考:《Effictive Java》单例模式的实现

参考:http://blog.csdn.net/lovelion/article/details/7420888

设计模式-单例模式(Singleton Pattren)(饿汉模式和懒汉模式)的更多相关文章

  1. java设计模式单例模式 ----懒汉式与饿汉式的区别

    常用的五种单例模式实现方式 ——主要: 1.饿汉式(线程安全,调用率高,但是,不能延迟加载.) 2.懒汉式(线程安全,调用效率不高,可以延时加载.) ——其他: 1.双重检测锁式(由于JVM底层内部模 ...

  2. Java-设计模式-单例模式-饿汉模式、懒汉模式

    //-------------------------------------------------------------饿汉模式--开始----------------------------- ...

  3. Spring中单例模式中的饿汉和懒汉以及Spring中的多例模式

    链接:https://pan.baidu.com/s/1wgxnXnGbPdK1YaZvhO7PDQ 提取码:opjr 单例模式:每个bean定义只生成一个对象实例,每次getBean请求获得的都是此 ...

  4. 设计模式 单例模式(Singleton) [ 转载2 ]

    设计模式 单例模式(Singleton) [ 转载2 ] @author java_my_life 单例模式的结构 单例模式的特点: 单例类只能有一个实例. 单例类必须自己创建自己的唯一实例. 单例类 ...

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

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

  6. java中的单例模式(懒汉式+饿汉式)

    什么是单例模式: 单例模式既只能在自己本类中创建有且唯一的一个实例(姑且不考虑映射的情况)通过方法将该实例对外公开 第一种:单例模式-懒汉式 既调用getInstance()方法返回实例之前判断有没有 ...

  7. 设计模式 单例模式(Singleton) [ 转载 ]

    设计模式 单例模式(Singleton) [ 转载 ] 转载请注明出处:http://cantellow.iteye.com/blog/838473 前言 懒汉:调用时才创建对象 饿汉:类初始化时就创 ...

  8. 设计模式--单例模式Singleton

    单例模式顾名思义整个程序下只有一个实例,例如一个国家只有一个皇帝,一个军队只有一个将军.单例模式的书写又分为饿汉模式和懒汉模式 饿汉模式   类中代码 package demo; public cla ...

  9. Java单例模式之饿汉模式与懒汉模式

    单例模式是我们在开发软件的过程中经常用到的23中常用的java模式之一,主要的功能就是保证我们所使用的对象只有一个,这也在一方面减少了出错的可能性,增强了代码的健壮.单例模式一般来说有两种实现的方式, ...

随机推荐

  1. 动态创建radio、checkbox时需要注意的问题

    1.给radio.checkbox后面添加文字 2.创建默认选中 3.创建完可选 function create(){ var board = document.getElementById(&quo ...

  2. JVM常见面试题

    1. 内存模型以及分区,需要详细到每个区放什么. 栈区: 栈分为java虚拟机栈和本地方法栈 重点是Java虚拟机栈,它是线程私有的,生命周期与线程相同. 每个方法执行都会创建一个栈帧,用于存放局部变 ...

  3. 转:Ogre内部渲染流程

    以下是 Ogre 的代码中的详细说明: Renderable是OGRE中所有可渲染对象的抽象接口 这个接口抽象出了在渲染管线中的被分组的离散的可渲染对象基本的方法. 此接口的实现类必须是基于单一的材质 ...

  4. Swift3.0 - 实现剪切板代码拷贝及跨应用粘贴

    有个需求,点击某个按钮,实现一段内容的拷贝,然后到其他应用内,直接长按粘贴. 实现如下: /// 测试剪切板,实现代码拷贝内容 func testPasteBoard(str:String) { // ...

  5. Linux查看GPU使用情况

    watch -n 10 nvidia-smi 一.watch watch命令用来定时执行某个程序 二.nvidia-smi nvdia-smi是英伟达自带的GPU监控命令.

  6. java struts2入门学习--基于xml文件的声明式验证

    一.知识点总结 后台验证有两种实现方式: 1 手工验证顺序:validateXxx(针对Action中某个业务方法验证)--> validate(针对Action中所有的业务方法验证) 2 声明 ...

  7. 【Algorithm】回溯法与深度优先遍历的异同

    1.相同点: 回溯法在实现上也是遵循深度优先的,即一步一步往前探索,而不像广度优先那样,由近及远一片一片地扫. 2.不同点 (1)访问序 深度优先遍历: 目的是“遍历”,本质是无序的.也就是说访问次序 ...

  8. 细说PHP中strlen和mb_strlen的区别(转)

    在PHP中,strlen与mb_strlen是求字符串长度的函数,但是对于一些初学者来说,如果不看手册,也许不太清楚其中的区别.下面通过例子,讲解这两者之间的区别. 先看例子: <?php // ...

  9. ASP.NET Core网站初探

    原文地址:https://blog.csdn.net/iml6yu/article/details/74530679 目录结构如下图   目录: Properties:属性,记录了项目属性的配置文件. ...

  10. IDEA使用笔记(二)——常用快捷键

    1:在IDEA上面找到快捷键都是有哪些?如下图所示: 2:导出快捷键的描述文件,打印一份,慢慢看,多使用,慢慢的就记住了 3:我自己在开发中经常使用的IDEA快捷键,主要是导航.查找.编辑相关的,如下 ...