2019独角兽企业重金招聘Python工程师标准>>>

单例模式确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例。在计算机系统中,线程池、缓存、日志对象、对话框、打印机、显卡的驱动程序对象常被设计成单例。这些应用都或多或少具有资源管理器的功能。每台计算机可以有若干个打印机,但只能有一个Printer Spooler,以避免两个打印作业同时输出到打印机中。每台计算机可以有若干通信端口,系统应当集中管理这些通信端口,以避免一个通信端口同时被两个请求同时调用。总之,选择单例模式就是为了避免不一致状态,避免政出多头;

一、懒汉式

//懒汉式单例类.在第一次调用的时候实例化自己
public class Singleton {  //私有的默认构造子   private Singleton() {}       private static Singleton single=null;  //静态工厂方法    public static Singleton getInstance() {  if (single == null) {    single = new Singleton();  }    return single;  }
}

Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。但是以上懒汉式单例的实现没有考虑线程安全问题,它是线程不安全的,并发环境下很可能出现多个Singleton实例,下面介绍的饿汉式单例是线程安全的。

二、饿汉式

//饿汉式单例类.在类初始化时,已经自行实例化
public class Singleton1 {  //私有的默认构造子   private Singleton1() {}  //已经自行实例化    private static final Singleton1 single = new Singleton1();  //静态工厂方法    public static Singleton1 getInstance() {  return single;  }
}

饿汉式在类创建的同时就已经创建好一个静态的对象供系统使用,以后不再改变,所以是线程安全的;

三、登记式

import java.util.HashMap;import java.util.Map;//登记式单例类.//类似Spring里面的方法,将类名注册,下次从里面直接获取。public class Singleton3 {private static Map<String,Singleton3> map = new HashMap<String,Singleton3>();static{Singleton3 single = new Singleton3();map.put(single.getClass().getName(), single);}//保护的默认构造子protected Singleton3(){}//静态工厂方法,返还此类惟一的实例public static Singleton3 getInstance(String name) {if(name == null) {name = Singleton3.class.getName();System.out.println("name == null"+"--->name="+name);}if(map.get(name) == null) {try {map.put(name, (Singleton3) Class.forName(name).newInstance());} catch (InstantiationException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (ClassNotFoundException e) {e.printStackTrace();}}return map.get(name);}//一个示意性的商业方法public String about() {    return "Hello, I am RegSingleton.";    }    public static void main(String[] args) {Singleton3 single3 = Singleton3.getInstance(null);System.out.println(single3.about());}}

登记式单例实际上维护了一组单例类的实例,将这些实例存放在一个Map(登记薄)中,对于已经登记过的实例,则从Map直接返回,对于没有登记的,则先登记,然后返回。

饿汉式和懒汉式区别:这两种乍看上去非常相似,其实是有区别的,主要两点

1、线程安全:

饿汉式是线程安全的,可以直接用于多线程而不会出现问题,懒汉式就不行,它是线程不安全的,如果用于多线程可能会被实例化多次,失去单例的作用。

如果要把懒汉式用于多线程,有两种方式保证安全性,一种是在getInstance方法上加同步,另一种是在使用该单例方法前后加双锁。

2、资源加载:

饿汉式在类创建的同时就实例化一个静态对象出来,不管之后会不会使用这个单例,会占据一定的内存,相应的在调用时速度也会更快,而懒汉式顾名思义,会延迟加载,在第一次使用该单例的时候才会实例化对象出来,第一次掉用时要初始化,如果要做的工作比较多,性能上会有些延迟,之后就和饿汉式一样了。

什么是线程安全?

如果你的代码所在的进程中有多个线程在同时运行,而这些线程可能会同时运行这段代码。如果每次运行结果和单线程运行的结果是一样的,而且其他的变量的值也和预期的是一样的,就是线程安全的。或者说:一个类或者程序所提供的接口对于线程来说是原子操作,或者多个线程之间的切换不会导致该接口的执行结果存在二义性,也就是说我们不用考虑同步的问题,那就是线程安全的。

此文代码来自网上,并非自己所写,如果有错误,尽情见谅!

转载于:https://my.oschina.net/marcello/blog/403983

java单例模式之深入浅出相关推荐

  1. Java单例模式个人总结(实例变量和类变量)

    Java单例模式 背景知识:Static关键字. 在对于定义类的变量,分为两种,是否具有static修饰的变量: 没有static修饰的变量,通过类的实例化(对象)引用,改变量称为实例变量: 使用st ...

  2. Java 单例模式探讨

    以下是我再次研究单例(Java 单例模式缺点)时在网上收集的资料,相信你们看完就对单例完全掌握了 Java单例模式应该是看起来以及用起来简单的一种设计模式,但是就实现方式以及原理来说,也并不浅显哦. ...

  3. Java单例模式优化写法

    转载自 http://blog.csdn.net/diweikang/article/details/51354982 Java单例模式优化写法 方法一:推荐 [java] view plain co ...

  4. Java高级篇——深入浅出Java类加载机制

    转载自 Java高级篇--深入浅出Java类加载机制 类加载器 简单讲,类加载器ClassLoader的功能就是负责将class文件加载到jvm内存. 类加载器分类 从虚拟机层面讲分为两大类型的类加载 ...

  5. Java单例模式的几种实现方式

    Java单例模式的几种实现方式 在Java 中,单例类只能有一个实例,必须创建自己的唯一实例,单例类必须给所有其他对象提供这一实例.Java 单例模式有很多种实现方式,在这里给大家介绍单例模式其中的几 ...

  6. Java 单例模式:懒加载(延迟加载)和即时加载

    Java 单例模式:懒加载(延迟加载)和即时加载 引言 在开发中,如果某个实例的创建需要消耗很多系统资源,那么我们通常会使用惰性加载机制(或懒加载.延时加载),也就是说只有当使用到这个实例的时候才会创 ...

  7. Java单例模式:为什么我强烈推荐你用枚举来实现单例模式

    写在前面--原作的这篇文章真的写的非常的简洁,逻辑清晰,将Java单例模式的各种写法写的非常清楚,并介绍了用枚举实现单例的最佳实践. 单例模式简介 单例模式是 Java 中最简单,也是最基础,最常用的 ...

  8. java单例模式 三种_三种java单例模式概述

    在java语言的应用程序中,一个类Class只有一个实例存在,这是由java单例模式实现的.Java单例模式是一种常用的软件设计模式,java单例模式分三种:懒汉式单例.饿汉式单例.登记式单例三种.下 ...

  9. 什么是java单例模式?

    关于java单例模式的文章早已是非常多了,本文是对我个人过往学习java,理解及应用java单例模式的一个总结.此文内容涉及java单例模式的基本概念,以及什单例模式的优缺点,希望对大家有所帮助. 什 ...

  10. 传智播客 刘意_2015年Java基础视频-深入浅出精华版 笔记(2015年10月25日23:28:50)

    day01 win 7系统打开DOS有趣方法:按住shift+右键,单击"在此处打开命令窗口"(注意:在此处可以是任何的文件夹,不一定是桌面) 用DOS删除的文件不可以在回收站恢复 ...

最新文章

  1. 关于CSS中表单的一些属性和使用
  2. 运维企业专题(11)RHCS高可用集群下MySql数据库与共享磁盘(单点写入、多点写入)的设置
  3. 一个简单RPC框架是怎样炼成的(II)——制定RPC消息
  4. 5种云计算安全基础知识和最佳实践
  5. SCVMM 2012 R2---安装SCVMM 2012 R2服务器
  6. 阅读王概凯老师架构漫谈系列总结
  7. 不使用加减乘除实现加法
  8. 一篇文章带你搞懂 DEX 文件的结构
  9. 数字时代的抉择,金蝶 EBC 的破局
  10. Array.Sort方法
  11. HDU 5281 Senior's Gun (贪心)
  12. matlab二元一次方程求解_方程的计算机处理913_Matlab
  13. 小组成员的github地址
  14. 【matlab】从图片中截取矩形区域(手工选取/标记在原图上/截取矩形区域并保存)
  15. php 邮件发送是html 没样式_PHP 下的 Socket 编程--发送邮件
  16. linux ssh密钥验证失败,连接Linux的服务器时使用SSH密钥认证及解决自动断连问题...
  17. 深度学习与计算机视觉教程(6) | 神经网络训练技巧 (上)(CV通关指南·完结)
  18. Amazon教程:刚买就降价!避免损失,申请PRICE MATCH(价格保护)的方法
  19. 上海“富爸爸” 神奇投资之路
  20. 【Developer Log】ProGuard扰码web项目(WAR)

热门文章

  1. 我的小站:诗词在线 http://www.chinapoesy.com 欢迎大家测试速度。特别是网通的。...
  2. 2017-2018 ACM-ICPC Pacific Northwest Regional Contest (Div. 1) B - Enlarging Enthusiasm dp好题
  3. 一个关于全局变量的问题
  4. Htmlunit 使用记录
  5. mybatis学习笔记(五):mybatis 逆向工程
  6. PCB 工程系统 模拟windows域帐号登入
  7. 用css实现图片翻转
  8. 提高开发效率的 Eclipse 实用操作
  9. Defining custom settings in Odoo
  10. 值类型和引用类型的区别?