注: 场景和例子出自github的设计模式。传送门:https://github.com/iluwatar/java-design-patterns/tree/master/singleton

意图:

单例模式即使为了确保一个类只有一个实例,并提供一个全局访问点。

场景:

世界上只有一座象牙塔可以让巫师学习魔法,所有巫师都来到这座象牙塔进行修习。那么象牙塔就这里可以理解为单例。简单的来说就是只创建一个类的一个对象,这个象牙塔就可以理解为唯一对象。

实现:

想更好的理解单例模式,最好先了解一下java中的关键字Static。传送门:http://www.cnblogs.com/ahangBlogs/p/7719330.html

talk is cheap,show me the code.........................................................................................................................................................................................................................................(分割线)

列举几种单例模式的实现方法:

 一:

package Singleton;

public final class IvoryTower {
private IvoryTower(){} private static final IvoryTower Instance=new IvoryTower(); public static IvoryTower GetInstance(){
return Instance;
}
}

二:ThreadSafeLazyLoaded

package Singleton;
public final class ThreadSafeLazyLoadedIvoryTower {
private static ThreadSafeLazyLoadedIvoryTower Instance; private ThreadSafeLazyLoadedIvoryTower(){
if(Instance!=null){
throw new IllegalStateException("Already initialized.");
}
}
public static ThreadSafeLazyLoadedIvoryTower GetInstance(){
if(Instance==null){
Instance=new ThreadSafeLazyLoadedIvoryTower();
}
return Instance;
}
}

三:线程安全双重锁检查

package Singleton;
public class ThreadSafeDoubleCheckLocking {
private static ThreadSafeDoubleCheckLocking instance; private ThreadSafeDoubleCheckLocking(){
if(instance!=null){
throw new IllegalStateException("Already instance!");
}
} public static ThreadSafeDoubleCheckLocking GetInstance(){
//使用局部变量可提高25%性能。 出自effectice java th2.. 简单来说就是局部变量保存在堆栈中....
ThreadSafeDoubleCheckLocking result=instance; //检查单例模式的实力是否初始化,如果已经初始化就直接返回实例,没有初始化就往下走
if(result==null){
//实例没有初始化,不过我们不能确保在这个时间段其他线程是否初始化了这个实例, 所以为了确保正确我们得锁住一个对象来互相排斥。
synchronized (ThreadSafeDoubleCheckLocking.class) {
//再次将是实例赋值给局部变量,这时候当前线程无法进入该锁空间,如果已经初始化我们返还实例
result=instance; if(result==null){
//进入该if中,即没有在其他线程中进行初始化。那么我们可以安全的创建一个实例作为我们的单例实例。
instance=result=new ThreadSafeDoubleCheckLocking();
}
}
}
return result;
} }

四:

package Singleton;

public enum EnumIvoryTower {
INSTANCE; @Override
public String toString(){
return getDeclaringClass().getCanonicalName() + "@" + hashCode();
}
}

适用性:

使用Singleton模式

  • 必须只有一个类的实例,并且必须可以从知名访问点访问客户端
  • 当唯一的实例应该通过子类来扩展时,客户端应该能够使用扩展实例而不修改它们的代

缺点:

  • 违反单一责任原则(SRP)通过控制自己的创作和生命周期。
  • 鼓励使用全局共享实例,以防止该对象使用的对象和资源被释放。
  • 创建紧密耦合的代码。Singleton的客户变得难以测试。

单例模式/ java实现附代码 /的更多相关文章

  1. 观察者模式/ java实现附代码 /

    /注:场景和例子引用github上的设计模式.传送门:https://github.com/iluwatar/java-design-patterns/tree/master/observer 场景: ...

  2. 正则表达式学习笔记(附:Java版示例代码)

    具体学习推荐:正则表达式30分钟入门教程 .         除换行符以外的任意字符\w      word,正常字符,可以当做变量名的,字母.数字.下划线.汉字\s        space,空白符 ...

  3. 单例模式及C++实现代码

    单例模式及C++实现代码 单例模式 单例模式,可以说设计模式中最常应用的一种模式了,据说也是面试官最喜欢的题目.但是如果没有学过设计模式的人,可能不会想到要去应用单例模式,面对单例模式适用的情况,可能 ...

  4. SpringCloud-创建服务消费者-Feign方式(附代码下载)

    场景 SpringCloud-服务注册与实现-Eureka创建服务注册中心(附源码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/deta ...

  5. JPA中实现双向多对多的关联关系(附代码下载)

    场景 JPA入门简介与搭建HelloWorld(附代码下载): https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103473937 ...

  6. Dubbo与SpringBoot整合流程(从实例入手,附代码下载)

    场景 Dubbo环境搭建-管理控制台dubbo-admin实现服务监控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10362 ...

  7. 07.深入浅出 Spring Boot - 数据访问之Mybatis(附代码下载)

    MyBatis 在Spring Boot应用非常广,非常强大的一个半自动的ORM框架. 代码下载:https://github.com/Jackson0714/study-spring-boot.gi ...

  8. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载

    一.分布式消息总线以及基于Socket的实现 在前面的分享一个分布式消息总线,基于.NET Socket Tcp的发布-订阅框架,附代码下载一文之中给大家分享和介绍了一个极其简单也非常容易上的基于.N ...

  9. 分享5种风格的 jQuery 分页效果【附代码】

    jPaginate 是一款非常精致的分页插件,提供了五种不同风格的分页效果,支持鼠标悬停翻页,快速分页功能.这款插件还提供了丰富的配置选项,你可以根据需要进行设置. 效果演示      源码下载 各个 ...

随机推荐

  1. 机器学习(4): KNN 算法

    1. 综述      1.1 Cover和Hart在1968年提出了最初的邻近算法      1.2 分类(classification)算法      1.3 输入基于实例的学习(instance- ...

  2. python标准库介绍——10 sys 模块详解

    ==sys 模块== ``sys`` 模块提供了许多函数和变量来处理 Python 运行时环境的不同部分. === 处理命令行参数=== 在解释器启动后, ``argv`` 列表包含了传递给脚本的所有 ...

  3. 有关UITableviewCell 重用内存 内部解析

    重用实现分析 查看UITableView头文件,会找到NSMutableArray*  visiableCells,和NSMutableDictnery* reusableTableCells两个结构 ...

  4. JDK1.5新特性,基础类库篇,调用外部命令类(ProcessBuilder)用法

    一. 背景 ProcessBuilder类是用来创建操作系统进程的.与Runtime.exec相比,它提供了更加方便的方法以创建子进程. 每个ProcessBuilder实例管理着一个进程属性的集合. ...

  5. Oracle学习笔记之四sp1,Oracle 11g的常用函数

    从Oracle学习笔记之四,SQL语言入门中摘出来的,独立成一章节 3.1 字符类函数 ASCII(c)和CHR(i)    分别用于返回一个字符的ASCII码和返回给定ASCII值所对应的字符. C ...

  6. NPOI之Excel——自动筛选、数字格式

    设置Excel的自动筛选功能 最新导出数据需要使用Excel的筛选功能,网上多方查找,终于在一个繁体的网站上找到了方法,呃,这个网站还是Java的,讲的是POI,不过.NET的NPOI也就一样用了. ...

  7. perl内置特殊变量查询

    perl中有许多预定于的内置变量,想$_,$,,$>,等等,基本是记不住全部的用法,如果在因特网查阅,有很麻烦,信息不准啦,说的不细啦,但是,万能的perldoc早就帮我们准备好了. 你需要做的 ...

  8. CCEaseElasticOut调整速度和振幅

    pSprite->setAnchorPoint(CCPoint(,)); pSprite->setPosition(CCPoint(,)); CCFiniteTimeAction* pAc ...

  9. LeetCode: Surrounded Regions 解题报告

    Surrounded Regions Given a 2D board containing 'X' and 'O', capture all regions surrounded by 'X'. A ...

  10. JVM致命错误日志(hs_err_pid.log)分析(转载)

    当jvm出现致命错误时,会生成一个错误文件 hs_err_pid<pid>.log,其中包括了导致jvm crash的重要信息,可以通过分析该文件定位到导致crash的根源,从而改善以保证 ...