饿汉模式

饿汉模式就是立即加载,在方法调用前,实例就已经被创建了,所以是线程安全的。

public class MyObject1 {
private static MyObject1 myObject1 = new MyObject1();
private MyObject1() {}
public static MyObject1 getInstance() {
return myObject1;
}
}

懒汉模式

懒汉就是延迟化加载,当需要使用的时候才进行实例化。

线程不安全

public class MyObject2 {
private static MyObject2 myObject2;
private MyObject2() {}
public static MyObject2 getInstance() {
if (myObject2 == null) {
myObject2 = new MyObject2();
}
return myObject2;
}
}

线程安全

线程安全但是效率低下

public class MyObject3 {
private static MyObject3 myObject3;
private MyObject3() {}
synchronized public static MyObject3 getInstance() {
if (myObject3 == null) {
myObject3 = new MyObject3();
}
return myObject3;
}
}

使用DCL双检查锁,线程安全而且效率得到提高,只将进行实例化的代码进行加锁。

public class MyObject4 {
private volatile static MyObject4 myObject4;
private MyObject4() {}
public static MyObject4 getInstance() {
if (myObject4 == null) {
synchronized (MyObject4.class) {
if (myObject4 == null) {
myObject4 = new MyObject4();
}
}
}
return myObject4;
}
}

使用静态内部类

线程安全,也是一种懒加载模式。

静态内部类中的静态成员只在第一次使用的时候加载,因此保证了线程安全。

public class MyObject5 {
private static class MyObject5Handle {
private static MyObject5 myObject5 = new MyObject5();
}
private MyObject5() {}
public static MyObject5 getInstance() {
return MyObject5Handle.myObject5;
}
}

使用static代码块

由于static代码块中内容在类加载的时候就执行了,因此保证了线程安全。

public class MyObject6 {
private static MyObject6 instance = null;
private MyObject6() {}
static {
instance = new MyObject6();
}
public static MyObject6 getInstance() {
return instance;
}
}

使用enum枚举

JVM会保证enum不能被反射并且构造器方法只执行一次,因此该单例是线程安全的。

public class MyObject7 {
private enum MyEnumSingleton {
enumFactory;
private MyObject7 myObject7;
private MyEnumSingleton() {
myObject7 = new MyObject7();
}
public MyObject7 getInstance() {
return myObject7;
}
}
public static MyObject7 getInstance() {
return MyEnumSingleton.enumFactory.getInstance();
}
}

Java单例模式的各种实现(饿汉、懒汉、静态内部类、static代码块、enum枚举类型)的更多相关文章

  1. JAVA单例模式:懒汉式,饿汉式

    今天复习了一下java的单例模式,写了懒汉式和饿汉式的实现例子.代码如下: 1.懒汉式单例 package com.lf.shejimoshi; /** * @classDesc: 类描述:(懒汉式单 ...

  2. Java单例模式《一》饿汉式

    package com.study.mode; /** * 单例模式:饿汉式. 线程安全. * @ClassName: SingleBean * @author BlueLake * @date 20 ...

  3. 关于Java单例模式中懒汉式和饿汉式的两种类创建方法

    一. 什么是单例模式 因程序需要,有时我们只需要某个类同时保留一个对象,不希望有更多对象,此时,我们则应考虑单例模式的设计. 二. 单例模式的特点 1. 单例模式只能有一个实例. 2. 单例类必须创建 ...

  4. Java基础之数据类型、内存、修饰符、代码块

    Java 数据类型 基本数据类型 数值:int.short.long 字符:char 布尔:boolean 引用数据类型 class(类) interface(接口) 数组[] 所占字节数(1 byt ...

  5. Java中static代码块,{}大括号代码块,构造方法代码块执行顺序!

    注:下列代码中的注释都是JUnit4单元测试运行结果. 首先,没有父类的(父类是Object)的类A package Static.of; public class A { { System.out. ...

  6. Java 中(静态)变量、(静态)代码块的执行顺序

    Java 中(静态)变量.(静态)代码块的执行顺序 非原创 本文讨论 Java 中(静态)变量.(静态)代码块的执行顺序 首先创建 3 个类 1.Foo 类 public class Foo { pu ...

  7. 零零碎碎的java知识:static属性、普通属性、static代码块、普通代码块、构造函数

    本文中结论仅经本机测试,不保证在别的环境下成立.如果有什么不成立的地方务必告诉我_(:_」∠)_ java的内存是动态分配的,其机制和c/c++相当不一样……emmm在此不表. static: ·st ...

  8. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个“伪全局”的概念,在Java中st ...

  9. Java中单例设计模式,饿汉式和懒汉式

    Java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主要介绍三种:懒汉式单例.饿汉式单例.登记式单例. 单例模式有以下特点: 1.单例类只能有一个实例. 2.单例类必须自己创建自己的唯 ...

随机推荐

  1. OVS VxLAN Flow 分析 - 每天5分钟玩转 OpenStack(149)

    OVS 的数据流向都是由 Flow 规则控制的,今天我们就来分析 VxLAN 的 Flow 规则.提个醒:这可能是本教程最烧脑的一节,let's rock it ! 下面分析控制节点上的 flow r ...

  2. windows 下 多版本nodejs切换 nvmw

    以下教程不适用于nodejs v0.6.5及以下版本 nvmw 下载到本地 Git clone https://github.com/hakobera/nvmw.git 2.设置环境PATH 添加如上 ...

  3. 【Spring】使用Spring的AbstractRoutingDataSource实现多数据源切换

    最近因为项目需要在做两个项目间数据同步的需求,具体是项目1的数据通过消息队列同步到项目2中,因为这个更新操作还涉及到更新多个库的数据,所以就需要多数据源切换的操作.下面就讲讲在Spring中如何进行数 ...

  4. MS office2010 ppt自动放映的设置方法

    在菜单“幻灯片放映”-“排练时间”,进入演示,然后设置每张幻灯片需要等待的时间后,手动切换到下一张(如图),一直放映结束,会提示你是否保存排练时间.然后在菜单“幻灯片放映”-“设置放映方式”,里面选择 ...

  5. Tesseract pytesseract的安装和使用

    Tesseract是开源的OCR引擎,可以识别的图片里的文字,支持unicode(UTF-8)编码,100多种语言,需要下载相应语言的训练数据. 安装: 有两种方法,一种是通过编译源码,比较麻烦.我使 ...

  6. JavaScript基础——兼容性、错误处理

    JavaScript基础-错误处理Throw.Try.Catch try语句执行可能出错的代码 catch语句处理捕捉到的错误 throw语句创建自定义错误语句 发生的常见的错误类型 可能是语法错误, ...

  7. rhel 6.7 离线安装docker

    本机系统信息 [test@rhel67temp ~]$ uname -a Linux rhel67temp 2.6.32-573.el6.x86_64 #1 SMP Wed Jul 1 18:23:3 ...

  8. Git 基本工作流程

    1. 用户信息配置(全局配置) $ git config --global user.name leo$ git config --global user.email hehe_xiao@qq.com ...

  9. 《C#语言和数据库技术基础》单词必备

    <C#语言和数据库技术基础> 第一章1..NET Framework   框架2.sharp            尖锐,强烈的3.application      应用程序4.devel ...

  10. mfc---单文档工程添加消息响应

    写消息映射:.h中些函数头文件afx_mag … .cpp中写函数体 .cpp中写消息映射 给toolbar添加消息: .h中添加头文件afx_msg …. .cpp中添加函数体,消息映射ON_COM ...