文档章节

六种单例模式

奋斗到天明
 奋斗到天明
发布于 2016/04/13 11:20
字数 458
阅读 86
收藏 7

单例模式

单例模式、常用的设计模式之一,这里收集一些Java的实现。包括经典饿汉模式、经典懒汉模式、静态代码、静态内部类、DCL同步代码、枚举。其中涉及到了类的实例化、序列化与反序列化时类的新建。但是没有涉及​万能的反射。

###经典饿汉模式 不管会不会用到这个类,首先实例化,这就是饿的意思。

	public cclass Ehan implements Serializable{
    private static Ehan eh = new Ehan();

    private Ehan(){}

    public static Ehan getSingleton(){
        return eh;
    }

    protected Object readResolve() throws ObjectStreamException{
        return eh;
    }
}

###静态代码 饿汉模式的变种。

public class Jtai implements Serializable{
    private static Jtai jt;
    private Jtai(){}

    static {
        jt = new Jtai();
    }

    public static Jtai getSingleton(){
        return jt;
    }

    protected Object readResolve() throws ObjectStreamException{
        return jt;
    }
}

###静态内部类 饿汉模式的变种。

public class Neibu implements Serializable{
    static class Handle{
        private static Neibu nb = new Neibu();
    }

    private Neibu(){}

    public static Neibu getSingleton(){
        return Handle.nb;
    }

    protected Object readResolve() throws ObjectStreamException{
        return Handle.nb;
    }
}

枚举

也是饿汉的一种吧,优势明显,不但可以避免多线程同步问题,而且免去反序列化可能会重新创建对象的问题。

public enum Meiju{
    SINGLETON;
    public void doSomeThing(){}
}

经典懒汉模式

等到第一次调用的时候才实例化。

public class Lanhan implements Serializable{
    private static Lanhan lhan;
    private Lanhan(){}
    synchronized public static Lanhan getSingleton(){
        if (lhan == null){
            lhan = new Lanhan();
        }
        return lhan;
    }

    protected Object readResolve() throws ObjectStreamException{
        return lhan;
    }
}

DCL同步代码

方法内同步代码块,使用volatile保持singleton字段的多线程可见性。DCL是双锁检查,需要检查两次是因为在第一次ifsynchronized无法保证操作的原子性,在多线程情况下是不安全的,所有synchronized代码块中再一次用if判断。

class Doucl implements Serializable{
    private static Doucl dc;
    private Doucl(){}
    public static Doucl getSingleton(){
        if(dc == null){
            synchronized (Doucl.class){
                if(dc == null){
                    dc = new Doucl();
                }
            }
        }
        return dc;
    }

    protected Object readResolve() throws ObjectStreamException{
        return dc;
    }
}

© 著作权归作者所有

奋斗到天明
粉丝 19
博文 112
码字总数 82707
作品 0
昌平
程序员
私信 提问
【设计模式笔记】(十六)- 代理模式

一、简述 代理模式(Proxy Pattern),为其他对象提供一个代理,并由代理对象控制原有对象的引用;也称为委托模式。 其实代理模式无论是在日常开发还是设计模式中,基本随处可见,中介者模式中...

MrTrying
2018/06/24
0
0
(目录)设计模式(可复用面向对象软件的基础)

本系列“设计模式”博客使用Golang语言实现算法。所谓算法是指解决一个问题的步骤,个人觉得不在于语言。小弟只是最近学习Golang,所以顺带熟练一下语法知识,别无它意。 本系列博客主要介绍...

chapin
2015/01/13
154
0
EasyToLearnDesignPattern

简单上手设计模式 GITHUB:https://github.com/Fisher-Joe/EasyToLearnDesignPattern 本文旨在使用最简单的语言,最简单的代码让人学习设计模式(最起码是我) 说明: 本文的所有内容都是基于...

芝麻开门
04/19
0
0
PHP设计模式(一):简介及创建型模式

我们分三篇文章来总结一下设计模式在PHP中的应用,这是第一篇创建型模式。 一、设计模式简介 首先我们来认识一下什么是设计模式: 设计模式是一套被反复使用、容易被他人理解的、可靠的代码设...

juhenj
2014/05/15
280
2
java设计模式-- 单例模式

在很久之前,也就是在大二暑假的时候,那时候看马士兵的视频教程中有提到很多的设计模式。 java的设计模式大致可以分为3大类,23种设计模式。 其中,创建型模式有5种:单例模式、建造者模式、...

爱学习的逃课君
2014/11/27
125
0

没有更多内容

加载失败,请刷新页面

加载更多

OSChina 周六乱弹 —— 早上儿子问我他是怎么来的

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @凉小生 :#今日歌曲推荐# 少点戾气,愿你和这个世界温柔以待。中岛美嘉的单曲《僕が死のうと思ったのは (曾经我也想过一了百了)》 《僕が死の...

小小编辑
今天
2.4K
15
Excption与Error包结构,OOM 你遇到过哪些情况,SOF 你遇到过哪些情况

Throwable 是 Java 中所有错误与异常的超类,Throwable 包含两个子类,Error 与 Exception 。用于指示发生了异常情况。 Java 抛出的 Throwable 可以分成三种类型。 被检查异常(checked Exc...

Garphy
今天
41
0
计算机实现原理专题--二进制减法器(二)

在计算机实现原理专题--二进制减法器(一)中说明了基本原理,现准备说明如何来实现。 首先第一步255-b运算相当于对b进行按位取反,因此可将8个非门组成如下图的形式: 由于每次做减法时,我...

FAT_mt
昨天
40
0
好程序员大数据学习路线分享函数+map映射+元祖

好程序员大数据学习路线分享函数+map映射+元祖,大数据各个平台上的语言实现 hadoop 由java实现,2003年至今,三大块:数据处理,数据存储,数据计算 存储: hbase --> 数据成表 处理: hive --> 数...

好程序员官方
昨天
61
0
tabel 中含有复选框的列 数据理解

1、el-ui中实现某一列为复选框 实现多选非常简单: 手动添加一个el-table-column,设type属性为selction即可; 2、@selection-change事件:选项发生勾选状态变化时触发该事件 <el-table @sel...

everthing
昨天
21
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部