一、什么是单例模式

  单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

二、代码

  1.一般创建

// 饿汉式单例
class Hungry { private Hungry() {
} private final static Hungry HUNGRY = new Hungry(); public static Hungry getInstance() {
return HUNGRY;
}
} // 懒汉式单例
class LazyMan {
private LazyMan() {
} private static LazyMan lazyMan = null; public static LazyMan getInstance() {
if (lazyMan == null) {
lazyMan = new LazyMan();
}
return lazyMan;
}
}

  2.DCL懒汉式------线程安全

    一般的懒汉式单例在多线程下会存在问题,因此需要进行操作。加双重检测锁进行检测

// DCL懒汉式单例
class LazyMan {
private LazyMan() {
System.out.println(Thread.currentThread().getName());
} private volatile static LazyMan lazyMan = null;//避免指令重排 public static LazyMan getInstance() {
if (lazyMan == null) {
synchronized (LazyMan.class) {
if (lazyMan == null)
lazyMan = new LazyMan();
            }
} return lazyMan;
}
}

    为什么要加volatile?因为volatile避免指令重排,在new LazyMan是,这个操作不是一个原子性操作,在执行分配空间(1)、执行构造方法,初始化对象(2)、把这个对象指向这个空间(3)执行这三步时,我们希望执行123,但是经过指令重排后可能是132,;如果此时A线程执行的是132,当B线程执行时,对象已经分配好空间以及指向这个空间,就会认为这个对象不为空,就不在执行,返回这个对象。但是第二步在A线程中还没有执行完,所以造成对象初始化失败,因此要加volatile关键字

  3.登记式/静态内部类-------线程安全

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

  4.枚举-------线程安全

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

JUC---11单例模式的更多相关文章

  1. JUC(11)各种锁的理解(公平锁、可重入锁、自旋锁、死锁)

    文章目录 1.公平锁.非公平锁 2.可重入锁 3.自旋锁 4.死锁 1.公平锁.非公平锁 公平锁:非常公平.不能插队.必须先来后到 非公平锁:非常不公平.可以插队.(默认非公平) 可以修改为公平锁 2 ...

  2. 06002001单例模式C#实现版本

    书名:设计模式之禅 作者:秦小波 出版社:机械工业出版社 1 描述 确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例 2 UML类图 图1-1 单例模式类图 3 代码 Singleto ...

  3. Java 面试知识点【背诵版 240题 约7w字】

    -- 转载自牛客网 是瑶瑶公主吖 Java 基础 40 语言特性 12 Q1:Java 语言的优点? ① 平台无关性,摆脱硬件束缚,"一次编写,到处运行". ② 相对安全的内存管理 ...

  4. 黑马程序员—— Java SE(2)

    ----<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训 ...

  5. HashMap与HashTable面试宝典

    u012233832的专栏 初生牛犊 目录视图 摘要视图 订阅 写博客,送money.送书.送C币啦   7-8月博乐推荐文章    砸BUG 得大奖 100%中奖率   微信开发学习路线高级篇上线  ...

  6. 2017百度软研(C++)

    问了很多,不过很多也都没有问到,感觉有点偏,很深入的东西,越问越虚.第一次实习面试从百度开始,也从百度结束吧.看得见的差距,不想将就,所以还是拿最后一次机会去尝试.win or go home, 所以 ...

  7. C#开发必会

    1.字符串的各种属性和方法: 2.数组的各种熟悉和方法: 3.public.private.protect.internal.protect internal 4.构造函数 5.属性 6.ADO.NE ...

  8. python基础学习18----面向对象简述

    这里就不再讲面向对象的相关概念知识或者与面向过程的比较了,直接进入类的学习 1.类的创建 class people: def __init__(self):#构造函数 pass sfencs=peop ...

  9. Java SE(2)

    1.this的两种用法:(1)当成员变量和局部变量重名是,可以用关键字this来区分 .this代表对象,代表的是this所在函数所属对象的引用(哪个对象调用了this所在的函数,this就代表哪个对 ...

  10. 地区sql

    /*Navicat MySQL Data Transfer Source Server : localhostSource Server Version : 50136Source Host : lo ...

随机推荐

  1. JVM学习(七)JMM内存模型

    一.什么是JMM 概念:Java内存模型(Java Memory Model ,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能 ...

  2. uni-app开发注意事项

    关于vue 1.注意 如果使用老版的非自定义组件模式,即manifest中"usingComponents":false,部分模版语法不支持,但此模式已于2019年11月起下线. ...

  3. Salesforce LWC学习(二十六) 简单知识总结篇三

    首先本篇感谢长源edward老哥的大力帮助. 背景:我们在前端开发的时候,经常会用到输入框,并且对这个输入框设置 required或者其他的验证,当不满足条件时使用自定义的UI或者使用标准的 inpu ...

  4. jpa基础知识掌握-分页-sql

    https://blog.csdn.net/liuchuanhong1/article/details/52042477

  5. Python-字符串解析-正则-re

    正则表达式 特殊字符序列,匹配检索和替换文本 普通字符 + 特殊字符 + 数量,普通字符用来定边界 更改字符思路 字符串函数 > 正则 > for循环 元字符 匹配一个字符 # 元字符大写 ...

  6. 微服务通信之feign的注册、发现过程

    前言 feign 是目前微服务间通信的主流方式,是springCloud中一个非常重要的组件.他涉及到了负载均衡.限流等组件.真正意义上掌握了feign可以说就掌握了微服务. 一.feign的使用 f ...

  7. Mbedtls和Opesnssl 解码x509Certificate

    最近项目需要添加解码x509Certificate功能,可以使用openssl或者mbedtls库.对这两个库的使用总结一下. 一 Openssl解码x509 Certificate 1. 初始化   ...

  8. 免费开源工作流Smartflow-Sharp v2.0

    @font-face { font-family: 宋体 } @font-face { font-family: "Cambria Math" } @font-face { fon ...

  9. macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来

    macOS使用ABP.vNext Core开发CMS系统(一) 让程序跑起来--2020年10月5日 国庆假期,陪老婆的同时也不能忘记给自己充充电,这不想搞个CMS系统,考虑自己的时间并不多,所以想找 ...

  10. Intel HEX格式

    来来 !! come baby  !  只强调一点这篇文章有checksum的算法,是我最喜欢地!! 参考:https://blog.csdn.net/extlife/article/details/ ...