[转] 如何正确地写出单例模式

你真的了解单例吗?

这两天在看 《多处理器编程的艺术》    (英文版)  里面提到懒汉式单例模式编写的不严密性。由此我想梳理下单例模式这个问题到底涉及哪些细节。于是找到文章一篇:

原文地址:http://wuchong.me/blog/2014/08/28/how-to-correctly-write-singleton-pattern/

pdf: 这里

要点:

1. 使用 “双重检验锁”优化性能 [懒汉式]

2. 使用volatile 避免“双重检验锁”中指令重排。且仅仅在1.5之后生效 [懒汉式]

3. 饿汉式 private static final Singleton instance = new Singleton(); 线程安全

4.  静态内部类 static nested class 写法:

public class Singleton {
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }
    private Singleton (){}
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

5. enum的写法

public enum EasySingleton{
    INSTANCE;
}

“不需要担心double checked locking,而且还能防止反序列化导致重新创建新的对象”

-------------------------------------------------

引发思考。spring的单例bean创建时是如何做的?待续

时间: 2024-10-27 19:09:20

[转] 如何正确地写出单例模式的相关文章

如何快速正确的写出各种分治算法的实现代码

分治算法大家都很熟悉,很多时候(比如ACM竞赛)当我们判断出一个问题可以用分治算法来解决的时候,却往往因为具体的问题的复杂性,难以很快理清思路,迅速正确地写出问题的分治算法. 因此,要想快速正确的写出分治算法的实现代码,就必须足够的认识分治算法.直接看结论 一.认识分治 在分治策略中,我们递归地解决一个问题,在每层递归中应用如下三个步骤: 1.分解(Divide):将问题划分为一些子问题,子问题的形式与原问题一样,只是规模更小. 2.解决(Conquer):递归地求解出子问题.如果子问题规模足够

dp表模型-如何写出for循环动态规划

题目很肤浅.. 但是这件事我们要做.. 那么有一种方法叫做刷表法.. 当你发现这个问题具有最优子结构,重叠子问题时 那么这是一个dp问题是使用本方法的前提 画出该dp状态所对应的矩阵 画出转移关系线...找出前置依赖的所有状态 如果我们能找到该表的一个遍历顺序可以使得 每次计算都依赖之前已经计算好的结果计算出来 那么我们就能正确地写出这个dp的递推写法 举个例子..矩阵链乘法是按dp表对角线转移 而最长公共子序列就正常m*n地for转移 ============= 这是解决dp问题的一个典型的d

在java中写出完美的单例模式

1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的--基本上每个开发者都能够随手写出--但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例模式的了解已经足够多了.我并不想危言耸听说一定还有你不知道的--毕竟我自己的了解也的确有限,但究竟你自己了解的程度到底怎样呢?往下看,我们一起来聊聊看~ 2. 什么是单例? 单例对象的类必须保证只有一个实例存在--这是维基百科上对单例的定义,这也可以作为对意图实现单例模式的代码进行检验的标准. 对单

7、链表(下):如何轻松写出正确的链表代码?

很汗颜,现在让自己完整的写出一个简单的链表结构竟然会无法动笔,作为一个程序猿,需要修行的路还很长. 技巧一:理解指针或引用的含义 将某个变量赋值给指针,实际上就是将这个变量的地址赋值给指针,或者反过来说,指针中存储了这个变量的内存地址,指向了这个变量,通过指针就能找到这个变量. 例子: p->next = q.这行代码的意思是p节点的next指针存储了q节点的内存地址. 同理, p->next = p->next->next.这行代码的意思是p节点的next指针存储了p节点的下下一

JAVA面试经典合集2:怎样写出一个线程安全的单例模式

怎样写出一个线程安全的单例模式 package com.chendan.mianshi; /** * * * @Description * @author ChenDan [email protected] * @date 2019年8月4日下午8:47:13 * */ public class MianShiTest2 { public static void main(String[] args) { // [email protected] // [email protected] //

2.2 为方便储户,某银行拟开发计算机储蓄系统。写出问题定义并分析此系统的可行性

为方便储户,某银行拟开发计算机储蓄系统.储户填写的存款单或取款单由业务员输入系统,如果是存款,系统记录存款人姓名.住址.存款类型.存款日期.利率等信息,并印出存款单给储户:如果是取款,系统计算利息并印出利息清单给储户. 写出问题定义并分析系统的可行性. 答:如果是存款,储户填写存款单,然后交给业务员键入系统,同时系统还要记录存款人姓名.住址(或电话号码).身份证号码.存款类型.存款日期.利率等信息,完成后由系统打印存款单给储户. 如果是取款,储户填写取款单,然后交给业务员,业务员把取款金额输入系

《Effective C 》资源管理:条款25--考虑写出一个不抛出异常的swap函数

条款25考虑写出一个不抛出异常的swap函数 条款25:考虑写出一个不抛出异常的swap函数 swap是STL中的标准函数,用于交换两个对象的数值.后来swap成为异常安全编程(exception-safe programming,条款29)的脊柱,也是实现自我赋值(条款11)的一个常见机制.swap的实现如下: namespace std{ template<typename T> void swap(T& a, T& b) { T temp(a); a=b; b=temp;

如何写出健壮的Java代码

近来在公司写代码,写出的代码发现BUG很多,为了实现一个功能,代码改了又改,影响了工单的效率,也影响个人绩效,因此从网上找了些关于写健壮代码的文章看了看,再加上自己的一些经验总结. 所谓健壮的代码是指:健壮性又称鲁棒性,是指软件对于规范要求以外的输入情况的处理能力. 所谓健壮的系统是指对于规范要求以外的输入能够判断出这个输入不符合规范要求,并能有合理的处理方式. 另外健壮性有时也和容错性,可移植性,正确性有交叉的地方. 比如,一个软件可以从错误的输入推断出正确合理的输入,这属于容错性量度标准,但

如何写出一个好的宝贝标题

先说下今天的内容哪些人不用看,做标品的不用看了,请点击浏览器右上角叉叉. 因为关于标题优化这块,做标品类目的没什么好讲的词,词太少,把行业所有热词往宝贝标题上一堆,标题就算完成了,可能所有热词堆上去之后,都还没有满30个字符.标品的标题优化就这么简单,我一句话就讲完了. 好了,进入今天的正题 非标品的标题优化思路 写标题的核心思路是让宝贝最大程度的获取自然流量 很多人觉得标题不重要,因为如果销量都没有,你再怎么样优化标题都没用! 这句话完全正确! 但是,有了销量之后呢? 今天的主题分两部分讲