文档章节

JAVA设计模式-单例模式

走世界
 走世界
发布于 2017/09/06 01:20
字数 647
阅读 7
收藏 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特性,用这种方式写不免让人感觉生疏,在实际工作中,也很少看见有人这么写过。

© 著作权归作者所有

共有 人打赏支持
走世界
粉丝 3
博文 96
码字总数 91434
作品 0
和平
程序员
20个设计模式和软件设计面试问题

不管是参加Java面试还是C#面试,设计模式和软件设计都是任何编程面试中的必问问题。实际上,编程能力和设计技巧是对彼此很好的补充。一个好的程序员通常都是一个好的软件设计人员。他们知道怎...

LCZ777
2014/08/13
0
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图,讲解工厂模式简单原理。 一、引子 话说...

法斗斗
05/08
0
0
设计模式3——Proxy设计模式

Proxy代理设计模式是一种控制对象访问的设计模式,类似于网络代理,网络代理机制如下图: Proxy代理设计模式机制如下: 代理模式UML图如下: 代理模式顺序图如下: 客户端程序通过代理程序来...

小米米儿小
2013/12/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

Ubuntu18.04 显卡GF-940MX安装NVIDIA-390.77

解决办法: 下面就给大家一个正确的姿势在Ubuntu上安装Nvidia驱动: (a)首先去N卡官网下载自己显卡对应的驱动:www.geforce.cn/drivers (b)下载后好放在英文路径的目录下,怎么简单怎么来...

AI_SKI
今天
0
0
深夜胡思乱想

魔兽世界 最近魔兽世界出了新版本, 周末两天升到了满级,比之前的版本体验好很多,做任务不用抢怪了,不用组队打怪也是共享拾取的。技能简化了很多,哪个亮按哪个。 运维 服务器 产品 之间的...

Firxiao
今天
0
0
MySQL 8 在 Windows 下安装及使用

MySQL 8 带来了全新的体验,比如支持 NoSQL、JSON 等,拥有比 MySQL 5.7 两倍以上的性能提升。本文讲解如何在 Windows 下安装 MySQL 8,以及基本的 MySQL 用法。 下载 下载地址 https://dev....

waylau
今天
0
0
微信第三方平台 access_token is invalid or not latest

微信第三方开发平台code换session_key说的特别容易,但是我一使用就带来无穷无尽的烦恼,搞了一整天也无济于事. 现在记录一下解决问题的过程,方便后来人参考. 我遇到的这个问题搜索了整个网络也...

自由的开源
今天
2
0
openJDK之sun.misc.Unsafe类CAS底层实现

注:这篇文章参考了https://www.cnblogs.com/snowater/p/8303698.html 1.sun.misc.Unsafe中CAS方法 在sun.misc.Unsafe中CAS方法如下: compareAndSwapObject(java.lang.Object arg0, long a......

汉斯-冯-拉特
今天
3
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部