注: 场景和例子出自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.........................................................................................................................................................................................................................................(分割线)

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

 一:

  1. package Singleton;
  2.  
  3. public final class IvoryTower {
  4. private IvoryTower(){}
  5.  
  6. private static final IvoryTower Instance=new IvoryTower();
  7.  
  8. public static IvoryTower GetInstance(){
  9. return Instance;
  10. }
  11. }

二:ThreadSafeLazyLoaded

  1. package Singleton;
  2. public final class ThreadSafeLazyLoadedIvoryTower {
  3. private static ThreadSafeLazyLoadedIvoryTower Instance;
  4.  
  5. private ThreadSafeLazyLoadedIvoryTower(){
  6. if(Instance!=null){
  7. throw new IllegalStateException("Already initialized.");
  8. }
  9. }
  10. public static ThreadSafeLazyLoadedIvoryTower GetInstance(){
  11. if(Instance==null){
  12. Instance=new ThreadSafeLazyLoadedIvoryTower();
  13. }
  14. return Instance;
  15. }
  16. }

三:线程安全双重锁检查

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

四:

  1. package Singleton;
  2.  
  3. public enum EnumIvoryTower {
  4. INSTANCE;
  5.  
  6. @Override
  7. public String toString(){
  8. return getDeclaringClass().getCanonicalName() + "@" + hashCode();
  9. }
  10. }

适用性:

使用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. Python 字典 items() 方法

    描述 Python 字典 items() 方法以列表形式(并非直接的列表,若要返回列表值还需调用list函数)返回可遍历的(键, 值) 元组数组. 语法 items() 方法语法: D.items() ...

  2. 统计学习方法:支撑向量机(SVM)

    作者:桂. 时间:2017-05-13  21:52:14 链接:http://www.cnblogs.com/xingshansi/p/6850684.html 前言 主要记录SVM的相关知识,参考 ...

  3. git版本控制文件提交到composer应用市场,并下载用市场的软件库

    要把github中的项目提交到composer中去,必须在github管理的项目中新建对应的composer.json文件, composer.json文件建立的方法 cmd定位到项目目录 compo ...

  4. Nginx访问PHP文件的File not found错误处理,两种情况

    这个错误很常见,原有有下面两种几种 1. php-fpm找不到SCRIPT_FILENAME里执行的php文件 2. php-fpm不能访问所执行的php,也就是权限问题 第一种情况 可以在你的loc ...

  5. Mysql 自增列 主键

    Mysql中假如有 ID Int auto_increment, CID varchar(36). 通常情况下都是 ID设置为主键. 假如要设置CID为主键.自增列ID必需是唯一索引. create ...

  6. Racket 版本的 24 点实现

    Racket 版本的 24 点实现 #lang racket ; Author: woodfox ; Date: Oct 11, 2014 ; ==================== 1. Non- ...

  7. selenium+phantomJS爬虫,适用于登陆限制强,点触验证码等一些场景

    selenium是非常出名的自己主动化測试工具,多数场景是測试project师用来做自己主动化測试,可是相同selenium能够作为基本上模拟浏览器的工具,去爬取一些基于http request不能或 ...

  8. 【翻译自mos文章】job 不能自己主动执行--这是另外一个mos文章,本文章有13个解决方法

    job 不能自己主动执行--这是另外一个mos文章 參考原文: Jobs Not Executing Automatically (Doc ID 313102.1) 适用于: Oracle Datab ...

  9. php批量删除数据库下指定前缀的表

    如何用php批量删除数据库下所有前缀为prefix_的表. 例子,统一删除前缀为“prefix_”的表. <?php //设置数据库连接信息.数据库服务器地址,数据库用户名,数据密码 mysql ...

  10. [svc]linux bridge&docker0&k8s pod网络模型通俗演义

    linux namespace&bridge通俗演义 linux接口类型 br0 eth0: 一个接口 veth : 一对接口,类似一跟网线,一头有地址,另一头连到别处, linux 2个na ...