`
icewubin
  • 浏览: 34869 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

第三种也是最推荐的单例模式

    博客分类:
  • Java
阅读更多
public class Singleton {

    private static class Holder {
        private static final Singleton instance = new Singleton();
    }

    private Singleton() {
    }

    public static Singleton getInstance() {
        return Holder.instance;
    }
}
分享到:
评论
18 楼 icewubin 2012-07-09  
单例的东西一般都是static,或者说单例的逻辑一般都是不需要持久化的,也不需要序列化或者反序列化,没关系的。
17 楼 magicgrass 2012-07-09  
icewubin 写道
pengqb 写道
icewubin 写道
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。

见:Effective java Second Edition 第二章第3条:用私有构造器或枚举类型强化Singleton属性。里面有各种单例模式的详细比较。

你说的我又不是不知道,你怎么这么照本宣读呢?

我不是说了,enum自身有限制的么?例如enum不能继承。

很多时候为了减少类的数量,或者某个单例类中有几个public static的公共方法,或者是有几个public static的常量,此时用我推荐的方式实现单例就是最完美的。

完美的定义:
1.加载这个类的时候不会提引发单例的初始化。

2.即使调用该类的public static方法或public static的常量也不会引提前引发单例的初始化。

3.只有在需要的时候才会初始化单例,而且不需要加同步控制,由JDK自身的classloader机制来完成高效的同步控制,这里的高效是值,只有第一次初始化的时候可能产生竞争,一旦初始化完毕不再产生同步竞争。

enum方式的单例只是符合上述第三条而已。碰到混合型功能的类,或者当前单例需要继承其他类,或者需要有Spring来管理一些有状态的bean的注入的话,enum就不能满足要求了。

如果有序列化,反序列化的情况,用枚举应该会更好
16 楼 icewubin 2011-09-19  
suu 写道
博主厉害,只是有点小小疑问,静态内部类在外部类加载时不会初始化么?搜了下,说法不一,忘楼主从原因上解惑,谢谢

内部类也是个类啊,和外部类一样,什么时候会触发该类的初始化构成呢?当然是对该类的变量进行使用,或者是调用了针对该类的Class.forName()方法。
15 楼 suu 2011-09-18  
博主厉害,只是有点小小疑问,静态内部类在外部类加载时不会初始化么?搜了下,说法不一,忘楼主从原因上解惑,谢谢
14 楼 icewubin 2010-05-13  
pengqb 写道
icewubin 写道
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。

见:Effective java Second Edition 第二章第3条:用私有构造器或枚举类型强化Singleton属性。里面有各种单例模式的详细比较。

你说的我又不是不知道,你怎么这么照本宣读呢?

我不是说了,enum自身有限制的么?例如enum不能继承。

很多时候为了减少类的数量,或者某个单例类中有几个public static的公共方法,或者是有几个public static的常量,此时用我推荐的方式实现单例就是最完美的。

完美的定义:
1.加载这个类的时候不会提引发单例的初始化。

2.即使调用该类的public static方法或public static的常量也不会引提前引发单例的初始化。

3.只有在需要的时候才会初始化单例,而且不需要加同步控制,由JDK自身的classloader机制来完成高效的同步控制,这里的高效是值,只有第一次初始化的时候可能产生竞争,一旦初始化完毕不再产生同步竞争。

enum方式的单例只是符合上述第三条而已。碰到混合型功能的类,或者当前单例需要继承其他类,或者需要有Spring来管理一些有状态的bean的注入的话,enum就不能满足要求了。
13 楼 pengqb 2010-05-13  
icewubin 写道
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。

见:Effective java Second Edition 第二章第3条:用私有构造器或枚举类型强化Singleton属性。里面有各种单例模式的详细比较。
12 楼 icewubin 2010-05-08  
之所以说第三种,就是指前两种饿汉式和懒汉式各有优缺点,第三种包含前两者的优点而没有前两者的缺点,并不是单纯的追求代码简单,实际上第三种的代码并不少。
11 楼 icewubin 2010-05-08  
pengqb 写道
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}

这种方式是有限制的,你如果enum用得多就知道了,enum有很多限制,毕竟不是普通的类。

还有就是enum的单例的效果是等价于饿汉式初始化方式的,并不是最理想的需要单例时才执行单例初始化代码的模式。
10 楼 pengqb 2010-05-08  
Java中我最推荐的单例模式:够简单吧,呵呵
public enum Singleton {
  instance;
}
9 楼 拥抱变化之美 2009-05-13  
我以前也是这样写过,不过就是总爱遗漏 final 关键字。
8 楼 icewubin 2009-05-04  
wakin2003 写道

你的意思是利用静态类只在第一次被调用的时候初始化来实现只调用一次构造方法,既实现单例模式是吧?这个方法很特别,呵呵。不错。

是的,的确如此。
7 楼 wakin2003 2009-05-04  
icewubin 写道

wakin2003 写道
这样为啥是最佳的呢?内部类能解决多线程访问的问题么?呵呵。 就是利用Java的类加载机制,来变相的解决多线程访问的问题。

你的意思是利用静态类只在第一次被调用的时候初始化来实现只调用一次构造方法,既实现单例模式是吧?这个方法很特别,呵呵。不错。
6 楼 icewubin 2009-05-02  
天机老人 写道

我想问的是,为什么解决了线程问题就是最佳的了呢? 水平有限还忘LZ回答一下! 学习一下!

最佳是指:
1.运行效率大大优于懒汉式,因为懒汉式有一个同步过程(因为Java中无法像C++那样用双重检查,所以那个同步无法避开)。

2.同时又不像饿汉式那样,过早的触发初始化。这个过早是指:
如果有如下的变量:
public static int totalNum = 0;
如果是恶汉式的话,一调用这个变量,这个类就会初始化,而用类加载的方式的话,不会这么早就开始单例初始化。
5 楼 天机老人 2009-05-01  
我想问的是,为什么解决了线程问题就是最佳的了呢?
水平有限还忘LZ回答一下!
学习一下!
4 楼 icewubin 2009-03-05  
wakin2003 写道

这样为啥是最佳的呢?内部类能解决多线程访问的问题么?呵呵。

就是利用Java的类加载机制,来变相的解决多线程访问的问题。
3 楼 wakin2003 2009-03-05  
这样为啥是最佳的呢?内部类能解决多线程访问的问题么?呵呵。
2 楼 icewubin 2008-10-23  
zzx0421 写道

构造方法要声明为私有吧?

漏了,多谢,补上。
1 楼 zzx0421 2008-10-23  
构造方法要声明为私有吧?

相关推荐

    Java设计模式之单例模式的七种写法

    懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式单例 public class Singleton1 { private Singleton1() {} private static Singleton1 ...

    五种单例模式

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这样的设计在很多场景下非常有用,比如控制共享资源、管理系统设置或者创建昂贵的对象时,避免频繁实例化造成的性能...

    三种工厂设计模式和两种单例模式

    在本文中,我们将深入探讨三种工厂设计模式——简单工厂模式、抽象工厂模式和工厂方法模式,以及两种单例模式——饿汉单例模式和懒汉单例模式。这些模式都是面向对象设计中的重要组成部分,对于理解和构建可维护、可...

    几种单例模式demo

    单例模式是软件设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制资源的唯一性、管理共享配置或者创建昂贵的对象时避免频繁创建销毁。 ...

    43丨单例模式(下):如何设计实现一个集群环境下的分布式单例模式?1

    单例模式是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,...

    设计模式——单例模式

    3. **枚举单例模式** ```java public enum Singleton { INSTANCE; } ``` 利用 Java 枚举的天然线程安全特性,这是一种简洁且高效的方式。同时,枚举避免了序列化导致的多实例问题。 以上就是关于单例模式的一些...

    C#单例模式详解 C#单例模式详解C#单例模式详解

    然而,单例模式也有一些缺点: - 打破了单一职责原则,因为单例类不仅要处理业务逻辑,还要管理自己的实例化。 - 单例模式难以进行单元测试,因为它没有公共的构造函数,使得模拟对象变得困难。 - 难以解耦,单例...

    23钟设计模式之单例模式

    单例模式是一种常用的设计模式,它的核心思想是在整个应用程序中,一个类只能有一个实例存在。单例模式常用于控制资源的共享,例如数据库连接池、日志服务等。单例模式有多种实现方式,常见的包括懒汉式、饿汉式以及...

    设计模式单例模式

    单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要频繁创建和销毁对象,且对象创建成本较高,或者需要共享资源的情况下非常...

    单例模式.ppt

    【单例模式】是一种常用的软件设计模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。在软件开发中,单例模式常用于管理共享资源或者需要协调多个组件交互的场景,比如数据库连接池、日志服务等。 ...

    设计模式之单例模式源码demo

    2. **懒汉单例模式**:延迟到第一次调用`getInstance()`方法时才进行实例化,这种实现方式解决了饿汉模式的内存浪费问题,但在多线程环境下不安全。 ```java public class Singleton { private static Singleton ...

    单例模式各种实现方式

    单例模式是软件设计模式中的一种基础且广泛应用的模式,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例...

    Java 单例模式 工具类

    Java中的单例模式是一种常用的软件设计模式,它保证一个类只有一个实例,并提供全局访问点。在Java编程中,单例模式常用于控制资源的访问,比如数据库连接池、线程池或者日志对象等。本篇文章将深入探讨如何在Java中...

    设计模式——单例模式(懒汉模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类在任何情况下都只有一个实例存在。这个模式在很多场景下非常有用,例如控制全局资源、管理配置信息等。本文将详细探讨单例模式的懒汉式实现,并结合源码进行解析...

    设计模式-单例模式

    单例模式是一种广泛应用于软件设计中的创建型设计模式,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。这样做的好处在于控制共享资源的访问,比如线程安全的数据库连接池或者配置管理等。 在Java中...

    单例模式的七种写法

    单例模式是软件设计模式中的一种经典模式,用于确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下都非常有用,比如控制数据库连接、管理缓存或者全局配置等。下面我们将详细探讨单例模式的七种...

    单例模式代码.rar

    单例模式的实现通常有以下几种方式: 1. **饿汉式(静态常量)**:这是最简单的单例实现方式,它在类加载时就完成了初始化,所以是线程安全的。代码如下: ```java public class Singleton { private static final...

    单例模式源代码

    在Java中实现单例模式主要有三种方式: 1. 饿汉式(静态常量): 这种实现方式是在类加载时就创建了单例对象,线程安全,且避免了同步开销。 ```java public class Singleton { private static final Singleton ...

    Java 单例模式.pptx

    单例模式的实现方式主要有三种:饿汉式、懒汉式以及静态内部类方式。 - **饿汉式** - **实现**: ```java public class Single1 { // 创建一个静态的实例 private static Single1 instance = new Single1(); ...

Global site tag (gtag.js) - Google Analytics