单例模式

问题

多线程操作同一对象保证对象的一致性

解决思路

只有一次实例化过程,产生一个实例化对象,并提供返回该对象的方法。

单例模式的分类

1 饿汉式

在加载类的时候就产生实例对象

public class HungerySingleton {

    /**
* 在加载说就产生了实例对象
*/
private static HungerySingleton instance = new HungerySingleton(); private HungerySingleton(){ }
/**
* @return 返回实例对象
*/
public static HungerySingleton getInstance(){
return instance;
}
}

线程安全性:在加载时就已经实例化,所以只有一次实例化,线程是安全的。

不是懒加载

性能不好

2 懒汉式

在加载类时不声明实例对象,当使用该对象时才会实例化对象,不过对象也只能实例化一次。

public class HoonSinglenton {
/**
* 在加载时只声明变量不产生了实例对象
*/
private static HoonSinglenton instance = null;
private HoonSinglenton(){ }
/**
* @return 返回实例对象
*/
public static HoonSinglenton getInstance(){
if (instance == null){
instance = new HoonSinglenton();
}
return instance;
}
}

**线程安全性:不安全,不能保证实例对象的唯一性。**在多线程访问时,如果有两个线程同时进入if判断那么这两个线程获取的对象不是同一对象,不符合单例模式的定义。

是懒加载

性能好

3 懒汉式+同步方法

public class HoonSynSinglenton {

    private static HoonSynSinglenton instance = null;
private HoonSynSinglenton(){ } public synchronized static HoonSynSinglenton getInstance(){
if (instance == null){
instance = new HoonSynSinglenton();
}
return instance;
}
}

线程安全性:安全

是懒加载

性能不好:synchronized修饰的方法在多线程访问时会退化成串行执行。

4 DCL(Double-Check-Locking)

public class DCL {

    private static DCL instance = null;
private DCL(){ } public synchronized static DCL getInstance(){
if (instance == null){
synchronized(DCL.class){
if (instance == null){
instance = new DCL();
}
}
}
return instance;
}
}

性能比较好

懒加载

保证线程安全性

缺点:会因为指令重排序,引起空指针异常

5 volatile + DCL

private volatile static DCL instance = null;

DCL解决方案

6 Holder

使用比较广泛的一种单例模式

在声明类时,成员变量中不声明实例变量,而放到内部静态类中,在静态类中实例化,避免懒汉式中加锁的问题。

public class HolderSinglenton {

    private HolderSinglenton(){}

    private static class Holder{
private static HolderSinglenton instance = new HolderSinglenton();
} public static HolderSinglenton getInstance(){
return Holder.instance;
}
}

7 枚举

Effective Java推荐该方法

public class EnumSingletonDemo {

    private EnumSingletonDemo(){}

    private enum EnumHolder{
/**
* 单例对象
*/
INSTANCE;
private EnumSingletonDemo instance;
EnumHolder(){
this.instance = new EnumSingletonDemo();
}
private EnumSingletonDemo getInstance(){
return instance;
}
} public static EnumSingletonDemo getInstance(){
return EnumHolder.INSTANCE.getInstance();
}
}

代码中的的枚举类型是一个内部类,内部类在Java中使用是懒加载只有使用时才会加载。加载EnumSingletonDemo类不会引起内部类的加载。

设计模式之单例模式(Java)的更多相关文章

  1. 软件设计模式之单例模式(JAVA)

    什么是单例模式? 单例模式是一种常用的软件设计模式.在它的核心结构中只包含一个被称为单例类的特殊类.通过单例模式可以保证系统中一个类只有一个实例而且该实例易于外界访问,从而方便对实例个数的控制并节约系 ...

  2. 设计模式之单例模式(JAVA实现)

    单例模式之自我介绍 我,单例模式(Singleton Pattern)是一个比较简单的模式,我的定义如下: Ensure a class has only one instance,and provi ...

  3. GOF23种设计模式之单例模式(java)

    GOF(group of four):四人帮 分类 创建者模式 单例模式 核心作用:保证一个类只有一个实例,并且提供一个访问该实例的全局访问点 优点: 由于单例模式只生成一个实例,减少了系统性能开销, ...

  4. java设计模式之单例模式(几种写法及比较)

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

  5. java 23 - 2 设计模式之单例模式

    单例模式:保证类在内存中只有一个对象. 如何保证类在内存中只有一个对象呢?  A:把构造方法私有  B:在成员位置自己创建一个对象  C:通过一个公共的方法提供访问 单例模式之饿汉式: (一进来就造对 ...

  6. [转]JAVA设计模式之单例模式

    原文地址:http://blog.csdn.net/jason0539/article/details/23297037 概念: java中单例模式是一种常见的设计模式,单例模式的写法有好几种,这里主 ...

  7. 设计模式 -- 单例模式(Java&&PHP)

    所谓单例模式,简单来说,就是在整个应用中保证只有一个类的实例存在.就像是Java Web中的application,也就是提供了一个全局变量,用处相当广泛,比如保存全局数据,实现全局性的操作等. 能够 ...

  8. java 设计模式之单例模式

    -------Success is getting what you want, happiness is wanting what you get. java设计模式之单例模式(Singleton) ...

  9. Java设计模式03:常用设计模式之单例模式(创建型模式)

    1.  Java之单例模式(Singleton Pattern ) 单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种. 单例模式有一下特点: 1.单例类只能有一个实 ...

  10. java设计模式之三单例模式(Singleton)

    单例对象(Singleton)是一种常用的设计模式.在Java应用中,单例对象能保证在一个JVM中,该对象只有一个实例存在.这样的模式有几个好处: 1.某些类创建比较频繁,对于一些大型的对象,这是一笔 ...

随机推荐

  1. hospital:广西大学生计算机设计大赛

    html 当时做到的就是这些了 <!DOCTYPE html><html lang="en"><head> <title>病人信息查 ...

  2. VMware下载及安装使用方法

    一.VMware的介绍: 虚拟机(Virtual Machine)指通过软件模拟的具有完整硬件系统功能的.运行在一个完全隔离环境中的完整计算机系统.DesktopVirtualBox,虚拟系统通过生成 ...

  3. 转:SQL SERVER 2014 安装图解(含 SQL SERVER 2014 安装程序共享)

    开篇介绍 2015年1月1日,新的一年开始之际,本来应该好好做点有意义的事情来跨个年的.结果,老习惯 - 睡觉之前一定要折腾一下电脑,说干就干,给新到的 DELL 电脑装虚机,下载 SQL SERVE ...

  4. Git 如何优雅地回退代码

    前言 从接触编程就开始使用 Git 进行代码管理,先是自己玩 Github,又在工作中使用 Gitlab,虽然使用时间挺长,可是也只进行一些常用操作,如推拉代码.提交.合并等,更复杂的操作没有使用过, ...

  5. 3D硬件加速提升动画性能 与 z-index属性

    目录 1. chrome Layer borders 2. 层创建标准 3. 例子 总结 1. chrome Layer borders <WebKit技术内幕>第二章介绍了网页的结构,其 ...

  6. [TimLinux] 理解selinux

    1. 概念 SELinux有三种工作模式:Enforcing, Permissive, disabled.Enforcing对应又有几种修饰(targeted, minimum, mls). 2. 解 ...

  7. JavaEE基础(04):会话跟踪技术,Session和Cookie详解

    本文源码:GitHub·点这里 || GitEE·点这里 一.会话跟踪 1.场景描述 比如登录某个购物网站,身份识别成功后,在网站下单,支付 等操作,这些操作中当前登录用户信息必须是共享的,这样这些操 ...

  8. 使用iCamera 测试MT9F002 1400w高分辨率摄像头说明

    一.硬件准备 l MT9F002摄像头模块 l iCamera 硬件主板CC1601 l MT9F002转接板(FPC_MT9F002 CB1602) 二.软件准备 l 下载iCamera软件 l 安 ...

  9. 大数据学习笔记——Linux完整部署篇(实操部分)

    Linux环境搭建完整操作流程(包含mysql的安装步骤) 从现在开始,就正式进入到大数据学习的前置工作了,即Linux的学习以及安装,作为运行大数据框架的基础环境,Linux操作系统的重要性自然不言 ...

  10. 2019年Spring Boot面试都问了什么?快看看这22道面试题!

    Spring Boot 面试题 1.什么是 Spring Boot? 2.Spring Boot 有哪些优点? 3.什么是 JavaConfig? 4.如何重新加载 Spring Boot 上的更改, ...