单例模式:保证一个类仅有一个实例,并提供一个访问它的全局访问点
安全的单例模式:
/* * @(#)Singleton.java 2014-8-1 * * Copyright 2014 XXXX, Inc. All rights reserved. */ package com.fiberhome.singleton; /** * 单例对象 * * @author liyan * @version 2014-8-1 * @since 1.0 */ public class Singleton { /** * 构造器似有化保证外部不能进行new操作 */ private Singleton(){} /** * 静态内部类保证线程安全 * * @author liyan * @version 2014-8-1 * @since 1.0 */ private static class SingleHolder { final static Singleton INSTANCE = new Singleton(); } /** * 获取实例对象的方法 * @return */ public static Singleton getInstance() { return SingleHolder.INSTANCE; } /** * 普通的类方法 */ public void doSth(){} }
不安全的单例设计:
/* * @(#)SingletonUnSafe.java 2014-8-1 * * Copyright 2014 XXXX, Inc. All rights reserved. */ package com.fiberhome.singleton; /** * 非线程安全的单例设计 * * @author liyan * @version 2014-8-1 * @since 1.0 */ public class SingletonUnSafe { private static SingletonUnSafe sing; /** * 似有化构造器 */ private SingletonUnSafe() { } /** * 获取实例方法 * @return */ public static SingletonUnSafe getInstance() { /* * 首次初始化当前对象的一种假设情景 * 此时的代码块执行过程中的快照 * 两个实例化线程:Thrad1 and Thread2 */ //线程切换Thrad2线程执行此处执行判断分支为True即将进入 if (sing == null) { //Thrad1 刚进入代码块,还没有执行new指令 sing = new SingletonUnSafe(); } return sing; } }
测试用例
/* * @(#)SingletonTest.java 2014-8-1 * * Copyright 2014 XXXX, Inc. All rights reserved. */ package com.fiberhome.singleton; import org.junit.Assert; import org.junit.Test; /** * 测试单例 * * @author liyan * @version 2014-8-1 * @since 1.0 * @see */ public class SingletonTest { @Test public void singletonTestCase() { Assert.assertEquals(Singleton.getInstance(), Singleton.getInstance()); } }
为什么静态内部类可以保证初始化单例对象的时候是线程安全的?
静态内部类SingleHolder在获取其静态域的时候发送getstatic指令,虚拟机接收到这个指令立即对SingleHolder初始化,在调用SingleHolder构造器初始化之前首先完成其静态域的收集和初始化,静态域初始化完成以后是以单例的形式存在静态块区域的,随后调用构造器,构造器的初始化由jvm保证线程安全。所以静态内部类的这种初始化时线程安全的。
关于类加载的时机
类加载的“顺序”(非线性):加载->验证->准备->解析->初始化->使用-卸载
在初始化阶段,虚拟机规范规定了只有4中情况必须立即对类进行初始化:
- 遇到new ,getstatic,putstatic,invokestatic四条字节码指令。如果类没有进行初始化需要对其进行初 始化操作。
- new : 使用new关键字实例化对象的时候
- getstatic /putstatic : 读取或者设置一个类的静态字段
- invokestatic :调用一个类的静态方法
- 调用reflect包的方法对类进行反射调用的时候,如果没有初始化,需要对其进行初始化
- 初始化一个类的时候,返现其父类还没有初始化,则需要初始化其父类
- 当虚拟机启动的时候,用户需要指定一个要执行的主类,虚拟机会先初始化这个主类
------------------------------------------补充概念------------------------------------
类加载器
“通过一个类的全限定名来获取描述此类的二进制字节流”这个动作的加载木块叫做“类加载器”
类加载器的分类:
- 启动类加载器(Bootstrap ClassLoader):加载存在<JAVA_HOME>\lib 或者-Xbootclasspath目录中的,并且是虚拟机可识别的类库到虚拟机内存。Java程序无法直接引用启动类加载器
- 扩展类加载器:加载<JAVA_HOME>\lib\ext目录中的,或者被java.ext.dirs系统变量指定的路径中的所有类库
- 应用程序类加载器:加载用户类路径(ClassPath)上指定的类库。
2014年8月1日 西安
hanily@msn.com
相关推荐
**设计模式——单例模式** 在软件工程中,设计模式是一种在特定场景下解决常见问题的标准方案,可以被复用并提升代码质量。单例模式是设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。这种模式...
设计模式是软件工程中的一种最佳实践,用于解决在不同场景下重复出现的问题。...通过阅读提供的"iOS 设计模式——单例"相关资料,可以深入理解在iOS开发环境中如何有效利用单例模式来优化代码结构和提高程序性能。
单例模式是软件设计模式中的一种经典模式,它保证了类在任何情况下都只有一个实例存在。这个模式在很多场景下非常有用,例如控制全局资源、管理配置信息等。本文将详细探讨单例模式的懒汉式实现,并结合源码进行解析...
单例的5中实现及反射和反序列化破解单例。
单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制共享资源、管理系统级别的服务或者简化对象间的交互。单例模式的核心在于...
本次将聚焦于一种较为简单的模式——单例模式。 #### 单例模式概述 单例模式是一种创建型模式,它的核心在于确保某个类只有一个实例,并提供一个全局可访问的访问点。这种模式非常实用,尤其是在需要频繁地创建和...
单例模式是软件设计模式中的一种经典模式,其主要目的是控制类的实例化过程,确保在任何情况下,一个类只有一个实例存在。这种模式通常用于管理共享资源或者全局配置,例如数据库连接池、线程池、日志服务等。在Java...
C++设计模式——单例模式-附件资源
【Java设计模式——单例模式】 单例模式是一种常见的软件设计模式,它的核心思想是确保在应用程序的整个生命周期中,某个类只有一个实例存在。这种模式主要用于控制类的实例化过程,减少系统资源的消耗,提高系统...
策略模式和单例模式是软件设计中两种非常重要的设计模式,它们在实际开发中有着广泛的应用。在这篇文章中,我们将深入探讨这两种模式的核心概念、实现方式以及如何在实际项目中运用。 策略模式是一种行为设计模式,...
1)程序功能:单例模式设计Memcache和Redis操作类,采用PHP编写。 2)程序详解地址:http://blog.csdn.net/clevercode/article/details/46410055。 3)原创作品,出自"CleverCode的博客",分类为《设计模式之PHP项目...
单例模式是软件设计模式中的一种,它保证一个类只有一个实例,并提供一个全局访问点。在iOS应用开发中,单例模式被广泛用于管理共享资源、实现全局设置、提供网络请求管理器等场景。让我们深入探讨一下单例模式在iOS...
内容概要:本文档介绍了三个经典的软件设计模式——单例模式(Singleton Pattern)、工厂模式(Factory Pattern)以及观察者模式(Observer Pattern)的具体实现,并给出了带有详细注释的C++代码范例。对每个设计模式都有...
本次我们将深入探讨两种设计模式——单例模式和装饰模式,它们在Java编程中都有着广泛的应用。 首先,让我们来理解“单例模式”。单例模式是一种创建型设计模式,其核心思想是保证一个类只有一个实例,并提供一个...
**设计模式——单例模式** 单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池...
单例模式是设计模式中最常见也最简单的一种设计模式,保证了在程序中只有一个实例存在并且能全局的访问到。比如在Android实际APP 开发中用到的 账号信息对象管理, 数据库对象(SQLiteOpenHelper)等都会用到单例...
单例模式的实现饿汉式懒汉式线程安全的懒汉式登记式单例模式的优缺点单例模式的优点单例模式的缺点 单例模式是23个模式中比较简单的模式,应用也非常广泛 什么是单例模式? 单例模式的定义: Ensure a class ...