单例模式(Singleton Pattern)属于创建型模式,它确保在同一个进程内,单例类只有一个对象,并且 该对象对所有其他对象提供访问,常见的如Windows系统下的资源管理器、Spring Bean等都会采用这种方式。

一般来说,正确实现单例有如下几点要求:

将其构造方法设为私有;

防止对象在初始化被多个线程同时运行;

确保该对象不可序列化;

确保该对象无法克隆。

下面举例介绍实现单例模式的四种方法:

一、利用枚举实现单例:

利用枚举实现单例时,枚举类的静态成员变量的初始化在构造方法之后执行,构造方法中不要操 作静态成员变量。

enum RecommandSingleton {SINGLETON;public void doSomething() {}
}

二、利用静态内部类实现单例:

final class RecommandSingleton {private static class SingletonHolder {static final RecommandSingleton INSTANCE = new RecommandSingleton();}private RecommandSingleton() {}public static RecommandSingleton getInstance() {return SingletonHolder.INSTANCE;}
}

三、利用Spring的依赖注入能力实现单例(其他诸如Guice、Dagger等也可以实现):

@Component
class RecommandSingleton {public void doSomething() {}
}@Component
class SomeServiceImpl {private final RecommandSingleton singleton;@Autowiredpublic SomeServiceImpl(RecommandSingleton singleton) {this.singleton = singleton;}
}

四、双重检查锁

把 instance 声明为 volatile ,当一个线程初始化 Singleton 对象时,会在这个线程和 其他任何获取该实例的线程之间建立起happens-before关系。避免使用到未初始化完全的对象引用。

final class Singleton {private static volatile Singleton instance = null;private static final Object LOCK = new Object();private Singleton() {...}public static Singleton getSingletonInstance() {if (instance == null) {synchronized (LOCK) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

实现单例模式四种方法--java相关推荐

  1. java连接sql server2008_java连接sql-server-2008的四种方法

    <java连接sql-server-2008的四种方法>由会员分享,可在线阅读,更多相关<java连接sql-server-2008的四种方法(11页珍藏版)>请在人人文库网上 ...

  2. Java创建并执行线程的四种方法

    Java创建并执行线程的四种方法 java里面创建线程有四种方式: 无返回: 实现Runnable接口,重写run(); 继承Thread类,重写run(); 有返回: 实现Callable接口,重写 ...

  3. html获取data-*值,html5 获取和设置data-*属性值的四种方法讲解

    1.获取id的对象 2.需要获取的就是data-id 和 dtat-vice-id的值 一:getAttribute()方法 const getId = document.getElementById ...

  4. java 中lock,java中lock获取锁的四种方法

    在java接口中会存放着许多方法,方便线程使用时的直接调用.对于lock接口大家都不陌生,我们已经初步对概念进行了理解.那么在获取锁的方法上想必还不是很清楚.下面我们就lock获取锁的四种方法分别进行 ...

  5. 详解Java解析XML的四种方法

    http://developer.51cto.com  2009-03-31 13:12  cnlw1985  javaeye  我要评论(8) XML现在已经成为一种通用的数据交换格式,平台的无关性 ...

  6. Java 判断字符串是否为空的四种方法、优缺点与注意事项

    以下是Java 判断字符串是否为空的四种方法: 方法一: 最多人使用的一个方法, 直观, 方便, 但效率很低: if(s == null ||"".equals(s)); 方法二: ...

  7. 【转】Java中字符串中子串的查找共有四种方法(indexof())

    原文网址:http://wfly2004.blog.163.com/blog/static/1176427201032692927349/ Java中字符串中子串的查找共有四种方法,如下: 1.int ...

  8. java多线程传值覆盖_Java 多线程传值的四种方法

    其实大家都知道多线程传值有三种方式: 1:通过构造方法传递数据 2:通过变量和方法传递数据 3:通过回调函数传递数据 那么博主有个非常变态的需求,所以找出了第四种实现方式,先看效果图: 动态Cron4 ...

  9. java互换_两个变量交换的四种方法(Java)

    对于两种变量的交换,我发现四种方法,下面我用Java来演示一下. 1.利用第三个变量交换数值,简单的方法. (代码演示一下) 1 class TestEV 2 //创建一个类 3 { 4 public ...

最新文章

  1. 给大家分享一个私藏已久的Python神器!
  2. 论坛报名 | 智能信息检索与挖掘的最新进展和挑战
  3. node JS獲取GPS_Node.js 14 正式发布:V8 引擎升级,新增异步本地存储 API
  4. 混合代码块 Markdown Leedcde
  5. 如何抓取所有域用户的hash(win2008--win2012)
  6. JavaScript设计模式与开发实践 - 单例模式
  7. C++公有、私有、保护继承的关系
  8. Spark SQL从入门到精通
  9. 桌面上的计算机打不开怎么办,电脑桌面计算机打不开怎么办
  10. Elastic基本概念
  11. [转]Android 上百实例源码分析以及开源分析
  12. 一个最简单的Delphi2010的PNG异形窗口方法
  13. 磁盘与文件系统管理详解
  14. 华中科技大学计算机组成,华中科技大学计算机组成原理.pptx
  15. [Kudu基础]--Kudu+Impala介绍 | 微店数据科学团队博客
  16. Ansible相关笔记1
  17. Xcode的几个编译设置
  18. 在vivado里用rtl描述_Vivado中两种RTL原理图的查看方法和区别
  19. 2021年慈溪横河中学高考成绩查询,慈吉中学 2020慈溪市普高排名一览表
  20. 《自动控制原理》(胥布工版)习题2-21

热门文章

  1. Pico neo3 Unity开发笔记
  2. MacBookPro截图神器 - Snipaste
  3. 在网页中添加3D模型并通过Mysql更新其位置
  4. Science特刊:……万能的生物钟
  5. python财务数据分析代码_人力和财务都可以学的Python数据分析实战
  6. 登录服务器显示太忙怎么办,吃鸡总提示服务器太忙怎么办 | 手游网游页游攻略大全...
  7. 考研失败是什么体验?
  8. Python实现录屏
  9. 辞职了要不要退微信群,如果要,如何“优雅地退群”?
  10. DataGridView打印专家组件2.5版正式发布