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设计模式(一)——单例模式的更多相关文章

  1. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  2. 折腾Java设计模式之单例模式

    博文原址:折腾Java设计模式之单例模式 单例模式 Ensure a class has only one instance, and provide a global point of access ...

  3. Java设计模式之单例模式(七种写法)

    Java设计模式之单例模式(七种写法) 第一种,懒汉式,lazy初始化,线程不安全,多线程中无法工作: public class Singleton { private static Singleto ...

  4. Java 设计模式之单例模式(一)

    原文地址:Java 设计模式之单例模式(一) 博客地址:http://www.extlight.com 一.背景 没有太多原由,纯粹是记录和总结自己从业以来经历和学习的点点滴滴. 本篇内容为 Java ...

  5. java设计模式1——单例模式

    java设计模式1--单例模式 1.单例模式介绍 1.1.核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 1.2.常见场景 1.3.单例模式的优点 1.4.常见的五种单例模式实现 ...

  6. java设计模式之单例模式你真的会了吗?(懒汉式篇)

    java设计模式之单例模式你真的会了吗?(懒汉式篇) 一.什么是单例模式? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一.这种类型的设计模式属于创建型模式,它提供 ...

  7. java设计模式之单例模式(几种写法及比较)

    概念: Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建 ...

  8. java设计模式- (1)单例模式

    参加校园招聘的笔试,发现公司都会考一些java设计模式,所以上网查询相关内容,总结常用的几种单例模式. 单例模式(Singleton Pattern)是 Java中最简单的设计模式之一.这种类型的设计 ...

  9. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  10. java设计模式之单例模式(七种方法)

    单例模式:个人认为这个是最简单的一种设计模式,而且也是在我们开发中最常用的一个设计模式. 单例模式的意思就是只有一个实例.单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例.这个 ...

随机推荐

  1. mysqli扩展和持久化连接

    mysqli扩展的持久化连接在PHP5.3中被引入.支持已经存在于PDO MYSQL 和ext/mysql中. 持久化连接背后的思想是客户端进程和数据库之间的连接可以通过一个客户端进程来保持重用, 而 ...

  2. Problem 6 二分

    $des$有 $n$ 个物品,第 $i$ 个物品有两个属性 $k_i, b_i$ ,表示它在时刻 $x$ 的价值为 $k_i \times x + b_i$ .当前处于时刻 $0$ ,你可以选择不超过 ...

  3. Spring|@Autowired与new的区别

    前两天写代码的时候遇到一个问题,通过new出来的对象,自动注入的属性总是报空指针的错误.到网上查了资料,才发现问题所在,同时也加深了自己对于容器IOC的理解.现在把这个问题记录一下,仅供大家参考. [ ...

  4. DDD应对运营活动系统腐化实践

    前言 任何人类的设计都会腐化,软件系统也不例外 腐化之谜 随着系统的规模增长和复杂度膨胀,系统会慢慢腐化. 于是改一个很简单的下单地址,就会牵动整个交易系统十几处的改动. 如何解决这种腐化之谜呢? 参 ...

  5. HTML中各标签对应的英文意思

    HTML中各标签对应的英文意思 一.总结 一句话总结: 结合标签的英语全称,可以更加方便的知道标签的意思 二.HTML中标签对应的英文(方便理解记忆)(转自) 转自:HTML中标签对应的英文(方便理解 ...

  6. 使用adb 命令(atrace)抓起systrace的方法。【转】

    本文转载自:https://www.cnblogs.com/liuliu-word/p/9963017.html adb shell atrace -c -b 10240 --async_start ...

  7. Gis基础知识,坐标 投影

    1. 大地测量学 (Geodesy) 大地测量学是一门量测和描绘地球表面的学科,也包括确定地球重力场和海底地形. 1.1 大地水准面 (geoid) 大地水准面是海洋表面在排除风力.潮汐等其它影响,只 ...

  8. Java对象为啥要实现Serializable接口

    Serializable接口概述 Serializable是java.io包中定义的.用于实现Java类的序列化操作而提供的一个语义级别的接口.Serializable序列化接口没有任何方法或者字段, ...

  9. Blockchain & BPM

    http://www.infoq.com/cn/news/2018/07/blockchain-BPM?utm_source=notification_email&utm_campaign=n ...

  10. 清除input的历史记录

    原始代码: <input class="" type="text"></input> 加上“autocomplete”属性,禁止历史的显 ...