饿汉模式

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

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. C# 6 与 .NET Core 1.0 高级编程 - 37 章 ADO.NET

    译文,个人原创,转载请注明出处,有不对的地方欢迎指出与交流. 英文原文:Professional C# 6 and .NET Core 1.0 - 37 ADO.NET --------------- ...

  2. GIS制图课程前言

    一直以来都想写一本关于电子地图制图的工具书,把过去所遇到的关于电子地图制图的种种方法.技巧和问题进行总结和归纳,传播电子地图制图的思路和心得. 从2010年开始,陆陆续续在华南地区开展了多场的电子地图 ...

  3. Visual Studio 与 Matlab实现混合编程

    环境: Win10 vs2010 Matlab2015 里面有很多选做的内容,其中2.3必做 1.Matlab环境设置:   (选做)我没有做这步,因为打mbuild -setup指令不识别,缺少SD ...

  4. .CN根域名被攻击至瘫痪,谁之过?

    2013-10-08 09:19 佚名 新浪科技 2013年8月25日凌晨,.CN域名凌晨出现大范围解析故障,经分析.CN的根域授权DNS全线故障,导致大面积.CN域名无法解析.事故造成大量以.cn和 ...

  5. 《HelloGitHub月刊》第11期

    <HelloGitHub>第11期 兴趣是最好的老师,<HelloGitHub>就是帮你找到兴趣! 简介 最开始我只是想把自己在浏览 GitHub 过程中,发现的有意思.高质量 ...

  6. p1154 地平线

    题目描述 Farmer John的牛们认为,太阳升起的那一刻是一天中最美好的,在那时她们可以看到远方城市模糊的轮廓.显然,这些轮廓其实是城市里建筑物模糊的影子. 建筑物的影子实在太模糊了,牛们只好把它 ...

  7. VUE2.0实现购物车和地址选配功能学习第二节

    第二节 创建VUE实例 购物车项目计划: 1.创建一个vue实例 2.通过v-for指令渲染产品数据 3.使用filter对金额和图片进行格式化 4.使用v-on实现产品金额动态计算 5.综合演示 ① ...

  8. x86_64的内存映射

    对于x86_64来说,逻辑地址由16位选择子和64位偏移量组成(而32位时,逻辑地址由16位段选择符和32位偏移量组成),段寄存器仅仅存放选择子.CPU的分段单元(SU)执行以下操作:[1] 先检查选 ...

  9. markdown中常见的转义字符

    markdown中的转义字符 字符 转义后字符 & & " " > > < < 不断空格   \ \\ ` \` * \* _ \_ {} ...

  10. How to create a repository in Github with Eclipse?

    How to create a repository in Github with Eclipse? Here is an answer. I will teach you how to do it ...