1. class Singletom
  2. {
  3.   //最差写法。构造方法是public的,有可能会被new出多个,那就不是单例了。
  4. public Singletom(){
  5. }
  6. public static Singletom instance ;
  7. public static void getInstance(){
  8. if(instance==null){
  9. instance= new Singletom();
  10. }
  11. }
  12. }
  13.  
  14. class Singletom
  15. {
  16.   //构造改成私有,基本满足,但多线程时,可能同时在get时是空,同时去new了对象。也出现了多个对象情况。
  17. private Singletom(){
  18.  
  19. }
  20. private static Singletom instance ;
  21. public static void getInstance(){
  22. if(instance==null){
  23. instance= new Singletom();
  24. }
  25. }
  26. }
  27.  
  28. class Singletom
  29. {
  30.  
  31. private Singletom(){
  32.  
  33. }
  34. private static Singletom instance ;
       //针对多线程进行同步,到这儿这个单例基本比较完善了。
  35. public static synchronized void getInstance(){
  36. if(instance==null){
  37. instance= new Singletom();
  38. }
  39. return instance ;
  40. }
  41. }
  42.  
  43. class Singletom
  44. {
  45.  
  46. private Singletom(){
  47.  
  48. }
      //双重检查模式
  49. private static Singletom instance ;
  50. public static void getInstance(){
  51. if(instance==null){
  52. synchronized(Singletom.class){
              if(instance==null){
  53.  
  54.            instance= new Singletom();
  1.           }
  2.  
  3. }
  4. }
  5. return instance ;
  6. }
  7. }
  8.  
  9. class Singletom
  10. {
  11.  
  12. private Singletom(){
  13.  
  14. }
      //加上原子操作,进一步保证多线程安全。
  15. private static volatile Singletom instance ;
  16. public static void getInstance(){
  17. if(instance==null){
  18. synchronized(Singletom.class){
  19.  
  20.         synchronized(Singletom.class){
  1.           if(instance==null){
               instance= new Singletom();
              }
  2.  
  3. }
  1. } } return instance ; } }
  2.  
  1. //饿汉式实现
  2. //这种方法比较完美,但是这个类会在载入的时候提前实例化,会浪费空间。
  3. public class SingleB {
  4.  
  5. private static final SingleB INSTANCE = new SingleB();
  6.  
  7. private SingleB() {}
  8.  
  9. public static SingleB getInstance() {
  10.  
  11. return INSTANCE;
  12.  
  13. }
  14.  
  15. }
  1. // Effective Java 第一版推荐写法
  2.  
  3. public class Singleton {
  4.  
  5. private static class SingletonHolder {
  6.  
  7. private static final Singleton INSTANCE = new Singleton();
  8.  
  9. }
  10.  
  11. private Singleton (){}
  12.  
  13. public static final Singleton getInstance() {
  14.  
  15. return SingletonHolder.INSTANCE;
  16.  
  17. }
  18.  
  19. }
    牛逼之处
    对于内部类SingletonHolder,它是一个饿汉式的单例实现,在SingletonHolder初始化的时候会由ClassLoader来保证同步,使INSTANCE是一个真·单例。同时,由于SingletonHolder是一个内部类,只在外部类的SingletongetInstance()中被使用,所以它被加载的时机也就是在getInstance()方法第一次被调用的时候。
  1.  
  1. Effective Java》的作者在这本书的第二版又推荐了另外一种方法,来直接看代码:
  2.  
  3. 复制代码
  4. // Effective Java 第二版推荐写法
  5.  
  6. public enum SingleInstance {
  7.  
  8. INSTANCE;
  9.  
  10. public void fun1() {
  11.  
  12. // do something
  13.  
  14. }
  15.  
  16. }
  17.  
  18. // 使用
  19.  
  20. SingleInstance.INSTANCE.fun1();
  21. 复制代码
  22. 看到了么?这是一个枚举类型……连class都不用了,极简。

Singletom 单例的更多相关文章

  1. C# 单例模式和窗体的单例打开方法

    第一种最简单,但没有考虑线程安全,在多线程时可能会出问题,不过俺从没看过出错的现象,表鄙视我…… public class Singleton{    private static Singleton ...

  2. java单例设计模式

    单例模式的特点: 1.单例类只能有一个对象(实例). 2.单例类必须自己创建自己的唯一实例 . 3.单例类必须给所有其他对象提供这一实例. 设置步骤: 1.将对象的应用成员变量用private来修饰. ...

  3. DBUtil数据库连接单例 —— 简单不简单

    单例大概是我最早产生明确模式意识的设计模式,因为它足够简单粗暴,目的足够明确. 单例么,就是不管怎么访问,都返回一个单一实例就好了,我最早应用在数据库的DBUtil中. public class DB ...

  4. SSH中Action的单例与多例

    Structs2中的Bean默认的是单例,在整个程序运行期间,每个Bean只有一个实例,只要程序在运行,这个实例就一直存在. 对于Action来说,单例就容易出问题.如果客户端每次提交的参数都是一样的 ...

  5. 《连载 | 物联网框架ServerSuperIO教程》- 8.单例通讯模式开发及注意事项

    1.C#跨平台物联网通讯框架ServerSuperIO(SSIO)介绍 <连载 | 物联网框架ServerSuperIO教程>1.4种通讯模式机制. <连载 | 物联网框架Serve ...

  6. static实现单例的隐患

    1. 前言 Java的单例有多种实现方式:单线程下的简单版本.无法在指令重排序下正常工作的Double-Check.static.内部类+static.枚举--.这篇文章要讨论的,是在使用static ...

  7. 架构师养成记--6.单例和多线程、ThreadLocal

    一.ThreadLocal 使用wait/notify方式实现的线程安全,性能将受到很大影响.解决方案是用空间换时间,不用锁也能实现线程安全. 来看一个小例子,在线程内的set.get就是thread ...

  8. 在Swift中实现单例方法

    在写Swift的单例方法之前可以温习一下Objective-C中单例的写法: + (instancetype)sharedSingleton{ static id instance; static d ...

  9. Javascript设计模式学习二(单例)

    定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 普通的单例模式: 使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象.比如:使用 ...

随机推荐

  1. iServer-Linux环境下开机自启动实现

    备注:该方案的前提是linux环境下已经安装部署好了iServer 1.在/etc/init.d/目录下创建iserver服务脚本文件. [root@localhost /]# vim /etc/in ...

  2. 二,kubernetes集群的安装初始化

    目录 部署 集群架构示意图 部署环境 kubernetes集群部署步骤 基础环境 基础配置 安装基础组件 配置yum源 安装组件 初始化 master 设置docker和kubelet为自启动(nod ...

  3. google的CacheBuilder缓存

    适用性: 计算或检索一个值的代价很高,并且对同样的输入需要不止一次获取值的时候,就应当考虑使用缓存. 常用用法: LoadingCache<Key, Graph> graphs = Cac ...

  4. MySQL更新字段来自另一个表的count()值

    假设有文章post和评论comment两个表,文章表记录有评论的数量,但是这个值我们要一次更新. 如下,现在post表的comment_count都是0,我们的目标是:执行一个SQL语句,让其把统计c ...

  5. noi.ac NA529 【神树的矩阵】

    表示今天一发A了这题拿了rk3...是个sb构造... 考虑除了\(n=1/m=1\)的情况,最小次数\(ans\)不会\(>3\). 对于\(n=1/m=1\),暴力即可. 然后考虑\(ans ...

  6. 还不会使用MyEclipse的Breadcrumb导航功能?再不看你就OUT了

    MyEclipse CI 2019.4.0安装包下载 使用DevStyle Breadcrumb导航可以轻松地浏览工作区,只需遵循breadcrumb路径即可.DevStyle作为Eclipse插件提 ...

  7. 在服务端中,读取properties资源文件中的数据

    1.获取到资源的路径 2.读取数据 //properties文件对象 Properties properties = new Properties(); //通过HttpServletRequest ...

  8. hiho #1485 : hiho字符串(滑动窗口)

    #1485 : hiho字符串 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 如果一个字符串恰好包含2个'h'.1个'i'和1个'o',我们就称这个字符串是hiho字符 ...

  9. 01-01 Web应用

    一 Web应用的组成 接下来我们学习的目的是为了开发一个Web应用程序,而Web应用程序是基于B/S架构的,其中B指的是浏览器,负责向S端发送请求信息,而S端会根据接收到的请求信息返回相应的数据给浏览 ...

  10. 对abel 转译 class 过程的研究----------------------引用

    作为当下最流行的 JavaScript 编译器,Babel 替我们转译 ECMAScript 语法,而我们不用再担心如何进行向后兼容. 零.前言 虽然在 JavaScript 中对象无处不在,但这门语 ...