饿汉模式

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

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. [2017.02.07] Lua入门学习记录

    #!/home/auss/Projects/Qt/annotated/lua -- 这是第一次系统学习Lua语言 --[[ 参考资料: 1. [Lua简明教程](http://coolshell.cn ...

  2. Linux(Ubuntu)下载安装破解Matlab2016

    跳过废话, 直接看教程 前言 笔者平常不是很喜欢用Matlab, 因为所需要的功能都能被Python替代, 而Matlab的肥和慢实在令人难以忍受. 在Linux系统下安装Matlab也比Window ...

  3. docker - 容器里安装ssh

    docker安装ssh 通过命令行安装 pull ubuntu镜像 docker pull ubuntu:latest 启动并进入bash docker run -it -d ubuntu:laste ...

  4. Java字符串之String与StringBuilder

    String与SringBuiler的一些比较   在Java中,我们会大量使用字符串,但是String究竟是怎样工作的我们可能没有想过太多,其实在String类中,每一个看起来会修改String值的 ...

  5. Omi教程-组件通讯

    组件通讯 Omi框架组建间的通讯非常遍历灵活,因为有许多可选方案进行通讯: 通过在组件上声明 data-* 传递给子节点 通过在组件上声明 data 传递给子节点 父容器设置 childrenData ...

  6. 【中文分词】结构化感知器SP

    结构化感知器(Structured Perceptron, SP)是由Collins [1]在EMNLP'02上提出来的,用于解决序列标注的问题:中文分词工具THULAC.LTP所采用的理论模型便是基 ...

  7. 利用Flume采集IIS日志到HDFS

    1.下载flume 1.7 到官网上下载 flume 1.7版本 2.配置flume配置文件 刚开始的想法是从IIS--->Flume-->Hdfs 但在采集的时候一直报错,无法直接连接到 ...

  8. Vue.js 系列教程 5:动画

    原文:intro-to-vue-5-animations 译者:nzbin 译者的话:经过两周的努力,终于完成了这个系列的翻译,由于时间因素及个人水平有限,并没有详细的校对,其中仍然有很多不易理解的地 ...

  9. JS实例——间歇循环滚动

    间歇滚动:滚动一行后,延迟2秒后继续滚动 具体实现代码如下: <!doctype html> <html lang="en"> <head> & ...

  10. XHTML表格

    1.基本格式: <table> <tr> <th>A</th><th>B</th><th>C</th>& ...