文档章节

JAVA设计模式-单例模式

Clarence_D
 Clarence_D
发布于 2017/05/08 14:37
字数 647
阅读 32
收藏 0

概念:
  JAVA中单例模式是一种常见的设计模式,单例模式的写法有很多种,这里主要介绍三种:懒汉式单例、饿汉式单例。单例模式有如下特点:
  1、单例类只能有一个实例。
  2、单例类必须自己创建自己的唯一实例。
  3、单例类必须给所有其他对象提供这一实例。

   单例模式确保某个类只有一个实例,且自行实例化向整个系统提供这个实例。在系统中线程池、日志对象、打印机、公用方法等被设计成单例。归根结底就是单例模式确保不一致状态。

一、懒汉试单例

1、懒汉(线程不安全)

package com.example.Controller;

/**
 * Title:懒汉(线程不安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {
    private static  Singleton singleton;
    private Singleton(){}
    //懒汉(线程不安全)
    public static  Singleton getInstance() {
       if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

2、懒汉(线程安全)

package com.example.Controller;

/**
 * Title:懒汉(线程安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    private static  Singleton singleton;
    private Singleton(){}
    //懒汉(线程安全)
    public static synchronized Singleton getSingleton() {
        if (singleton == null){
            singleton = new Singleton();
        }
        return singleton;
    }
}

3、双重检查锁定

package com.example.Controller;

/**
 * Title:双重检查锁定
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    private static  Singleton singleton;
    private Singleton(){}
    //双重检查锁定
    public static synchronized Singleton getSingleton() {
        if (singleton == null){
            synchronized(Singleton.class){
                if (singleton == null){
                    singleton = new Singleton();
                }
            }

        }
        return singleton;
    }
}

4、静态内部类创建懒汉(线程安全)

package com.example.Controller;

/**
 * Title:静态内部类创建懒汉(线程安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    //静态内部类创建懒汉(线程安全)
    private static class LazyHolder{
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton(){}
    public static Singleton getInstance(){
        return LazyHolder.INSTANCE;
    }
}

这种比上面1、2、3都好一些,既实现了线程安全,又避免了同步带来的性能影响。

二、饿汉式单例

package com.example.Controller;

/**
 * Title:饿汉(线程安全)
 * Author:Administrator
 * Time:2017/5/8 0008
 */
public class Singleton {

    //饿汉(天生线程安全)
    private Singleton(){}
    private static final Singleton instance = new Singleton();
    //静态工程方法
    public static Singleton getInstance(){
        return  instance;
    }
}

饿汉式在类初始化時就创建好了一个静态对象供系统使用,所以饿汉式天生就是线程安全的。

三、枚举

public enum Singleton {  
    INSTANCE;  
    public void whateverMethod() {  
    }  
} 

它不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象,个人认为由于jdk1.5中才加入enum特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少看见有人这么写过。

© 著作权归作者所有

共有 人打赏支持
Clarence_D
粉丝 9
博文 136
码字总数 107352
作品 0
天津
程序员
私信 提问
设计模式 2014-12-19

book: 阎宏《JAVA与模式》 架构设计栏目 http://blog.csdn.net/enterprise/column.html 概要: http://bbs.csdn.net/forums/Embeddeddriver 23种设计模式分别是: 1.单例模式 2.工厂方法模式...

jayronwang
2014/12/19
0
0
设计模式15——Template Method设计模式

Template Method模板方法设计模式定义一个操作中算法的骨架,将具体步骤的执行延迟到子类中实现。Java中的抽象类就是使用了模板方法设计模式。模板方法设计模式结构如下: 以文档处理为例,T...

小米米儿小
2014/01/24
0
0
简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别

转载:原地址http://www.cnblogs.com/zhangchenliang/p/3700820.html 简单工厂、工厂方法、抽象工厂、策略模式、策略与工厂的区别 结合简单示例和UML图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
2018/05/08
0
0
策略模式与SPI机制,到底有什么不同?

这里说的策略模式是一种设计模式,经常用于有多种分支情况的程序设计中。例如我们去掉水果皮,一般来说对于不同的水果,会有不同的拨皮方式。此时用程序语言来表示是这样的: 如上面代码所写...

陈树义
2018/09/03
0
0
学了那么多年设计模式依然不会用!那可真蠢!

什么是设计模式? 设计模式(Design Pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。 设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决...

GitChat技术杂谈
2018/10/26
0
0

没有更多内容

加载失败,请刷新页面

加载更多

day11

architect刘源源
7分钟前
0
0
论学好Linux系统的超级重要性

不知道各位在日常的工作生活中有没有接触过“rm -rf /*”这个命令,因为这个命令搞出来的事情可还不少呢!前段时间就在一个群里看到了有个小伙子,老板让他去维护一下服务器,这小伙也不太懂...

Linux就该这么学
昨天
0
0
git 使用

1,首先在github配置好信息和仓库,然后在本地进行操作 git init git config user.name 'zhangwuer' git config user.email '56789053@qq.com' 2,与远程分支建立连接 git checkout -b test......

天王盖地虎626
昨天
2
0
git checkout 命令详解

在日常的git操作中,git checkout——检出,是我们的常用命令。最为常用的两种情形是创建分支和切换分支。 在下面的命令中,使用了一些简写,在这里说明一下: git st # git statusgit ci ...

shzwork
昨天
7
0
【Nginx】Nginx多级代理,获取客户端真实请求IP以及每级代理IP

Nginx多级代理,获取客户端真实请求IP以及每级代理IP 如图所示,每一级nginx里的location配置里需要加上对应的配置,最后一级nginx是直接到应用,测试时为了方便,直接用echo模块去测试,打印...

薛定谔的旺
昨天
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部