`

Java中的五种实现方法【单例模式】

阅读更多
网上整理 学习
http://www.oschina.net/code/snippet_107039_6062
Thank you!

线程安全 还需看下面的文档附件

package singleton;

/**
 * @author lei
 * 单例模式的五种写法:
 * 1、懒汉
 * 2、恶汉
 * 3、静态内部类
 * 4、枚举
 * 5、双重校验锁
 * 2011-9-6
 */
/**
 *五、 双重校验锁,在当前的内存模型中无效
 */
class LockSingleton{
	private volatile static LockSingleton singleton;
	private LockSingleton(){}
	
	//详见:http://www.ibm.com/developerworks/cn/java/j-dcl.html
	public static LockSingleton getInstance(){
		if(singleton==null){
			synchronized(LockSingleton.class){
				if(singleton==null){
					singleton=new LockSingleton();
				}
			}
		}
		return singleton;
	}
	
}
/**
 * 四、枚举,《Effective Java》作者推荐使用的方法,优点:不仅能避免多线程同步问题,而且还能防止反序列化重新创建新的对象
 */
enum EnumSingleton{
	INSTANCE;
	public void doSomeThing(){
	}
}
/**
 * 三、静态内部类 优点:加载时不会初始化静态变量INSTANCE,因为没有主动使用,达到Lazy loading
 */
class InternalSingleton{
	private static class SingletonHolder{
		private final static  InternalSingleton INSTANCE=new InternalSingleton();
	}	
	private InternalSingleton(){}
	public static InternalSingleton getInstance(){
		return SingletonHolder.INSTANCE;
	}
}
/**
 * 二、恶汉,缺点:没有达到lazy loading的效果
 */
class HungrySingleton{
	private static HungrySingleton singleton=new HungrySingleton();
	private HungrySingleton(){}
	public static HungrySingleton getInstance(){
		return singleton;
	}
}
/**
 * 一、懒汉,常用的写法
 */
class LazySingleton{
	private static LazySingleton singleton;
	private LazySingleton(){
	}
	public static LazySingleton getInstance(){
		if(singleton==null){
			singleton=new LazySingleton();
		}
		return singleton;
	}	
}
4
2
分享到:
评论
6 楼 高军威 2014-06-06  
yixiandave 写道
高军威 写道
alvin198761 写道
53./**
54. * 二、恶汉,缺点:没有达到lazy loading的效果
55. */ 
56.class HungrySingleton{ 
57.    private static HungrySingleton singleton=new HungrySingleton(); 
58.    private HungrySingleton(){} 
59.    public static HungrySingleton getInstance(){ 
60.        return singleton; 
61.    } 
62.} 
-----------------
  private [final] static HungrySingleton singleton=new HungrySingleton();
似乎应该这样 


想听听理由

类被加载的时候已经实例化并永久占用内存

我感觉如果不加 [final] 也可以的啊 ,对象 在系统启动时就被实例化并加载到内存中了,除非服务器挂了,要不然也是 实例化并永久占用内存中啊,final 给这个类做了个结扎,不能被继承和修改。这样理解不对吗
5 楼 yixiandave 2014-06-06  
高军威 写道
alvin198761 写道
53./**
54. * 二、恶汉,缺点:没有达到lazy loading的效果
55. */ 
56.class HungrySingleton{ 
57.    private static HungrySingleton singleton=new HungrySingleton(); 
58.    private HungrySingleton(){} 
59.    public static HungrySingleton getInstance(){ 
60.        return singleton; 
61.    } 
62.} 
-----------------
  private [final] static HungrySingleton singleton=new HungrySingleton();
似乎应该这样 


想听听理由

类被加载的时候已经实例化并永久占用内存
4 楼 superhj1987 2014-06-06  
《Effective Java》已经说的很透彻了
3 楼 josico 2014-06-06  
是饿汉。。。。不要说得那么凶神恶煞 会吓坏小朋友的
2 楼 高军威 2014-06-05  
alvin198761 写道
53./**
54. * 二、恶汉,缺点:没有达到lazy loading的效果
55. */ 
56.class HungrySingleton{ 
57.    private static HungrySingleton singleton=new HungrySingleton(); 
58.    private HungrySingleton(){} 
59.    public static HungrySingleton getInstance(){ 
60.        return singleton; 
61.    } 
62.} 
-----------------
  private [final] static HungrySingleton singleton=new HungrySingleton();
似乎应该这样 


想听听理由
1 楼 alvin198761 2014-06-05  
53./**
54. * 二、恶汉,缺点:没有达到lazy loading的效果
55. */ 
56.class HungrySingleton{ 
57.    private static HungrySingleton singleton=new HungrySingleton(); 
58.    private HungrySingleton(){} 
59.    public static HungrySingleton getInstance(){ 
60.        return singleton; 
61.    } 
62.} 
-----------------
  private [final] static HungrySingleton singleton=new HungrySingleton();
似乎应该这样 

相关推荐

    Java实现多种单例模式

    以下是Java实现的六种单例模式的详细解释: 1. 懒汉式(Lazy Initialization): 这种方式延迟了单例对象的初始化,直到第一次被请求时。例如,`SingleInstance1.java`可能就实现了这种方式。代码通常包含一个私有...

    java单例模式实例

    在Java中,有多种实现单例模式的方法,每种都有其特点和适用场景。接下来,我们将深入探讨这些实现方式。 首先,我们来看**懒汉式(Lazy Initialization)**。这种实现方式是在类被首次请求时才创建单例对象,延迟...

    设计模式单例模式和工厂模式综合应用

    **代码**文件则提供了实际的Java实现,通过查看这些代码,我们可以看到单例模式和工厂模式如何在实践中被运用,包括类的定义、方法的实现以及如何通过代码调用来创建和管理对象。 总的来说,这个项目为学习和理解...

    JAVA单例模式的几种实现方法

    Java中实现单例模式的方法有很多种,每种方法都有其适用场景和优缺点。选择合适的实现方式需要根据实际需求和应用场景综合考虑。例如,如果程序启动时就需要单例对象,那么可以使用饿汉式;如果希望在真正需要时才...

    单例模式Java实现

    以上就是Java中实现单例模式的常见方法,每种方式都有其适用场景和优缺点。在实际开发中,我们需要根据项目需求选择合适的方式实现单例。同时,理解单例模式背后的原理和应用场景,有助于提升代码的设计质量。

    单例模式各种实现方式

    在Java中,实现单例模式有多种方法,每种都有其特定的优缺点和适用场景。以下是几种常见的单例模式实现方式: 1. **饿汉式(静态常量)**: 这是最简单的实现方式,它在类加载时就完成了初始化,因此是线程安全的...

    7种单例模式

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在很多场景下非常有用,比如控制共享资源、管理配置对象等。下面将详细介绍七种常见的单例模式实现...

    五种单例模式

    在Java、C#等面向对象语言中,实现单例模式有多种方法,下面我们将详细探讨五种常见的单例模式实现方式: 1. **饿汉式单例**: 这种方式是在类加载时就完成实例化,避免了线程同步问题。由于实例在类加载时已经...

    Java 单例模式.pptx

    单例模式是一种常用的软件设计模式,在这种模式中,一个类只能拥有一个实例,并且该类必须自行创建并提供这个实例。通常,单例模式用于确保某个类在整个应用程序生命周期中只存在一个实例,这有助于节省资源并简化对...

    Java 单例模式 工具类

    本篇文章将深入探讨如何在Java中实现单例模式,以及如何创建一个工具类来封装单例的创建。 首先,让我们了解单例模式的几种常见实现方式: 1. 饿汉式(静态常量): 这是最简单的单例实现,它在类加载时就完成了...

    java中的单例模式

    Java中的单例模式是一种设计模式,它用于保证一个类只有一个实例,并提供一个全局访问点。这种模式在系统中需要控制实例数量,特别是当这个实例需要频繁地被多个对象共享时非常有用,例如数据库连接池、线程池或者...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂

    在Java实现中,有静态代理和动态代理两种方式。静态代理是由开发者显式创建代理类,而动态代理则利用Java的动态代理API在运行时动态生成代理类。 工厂模式是一种创建型设计模式,它提供了一种创建对象的统一接口,...

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

    在单例模式中,类的构造函数是私有的,防止外部直接创建对象,而是通过静态方法获取该类的唯一实例。单例模式的唯一性通常是在进程范围内,即在同一个进程中,无论何时调用单例类的获取实例方法,都会返回相同的对象...

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

    在 Java 中,单例模式的写法有好几种,主要有懒汉式单例、饿汉式单例、登记式单例等。 懒汉式单例是一种常见的单例模式实现方式,它在第一次调用的时候实例化自己。下面是懒汉式单例的四种写法: 1、基本懒汉式...

    java 设计模式 mvc模式 单例模式 代理 工厂 简单工厂 第二部分

    本篇将深入探讨标题中提及的几种设计模式:Model-View-Controller(MVC)模式、单例模式、代理模式以及工厂模式,尤其是简单工厂模式。 **1. Model-View-Controller (MVC) 模式** MVC模式是一种架构模式,它将应用...

    设计模式之单例模式(结合工厂模式)

    单例模式是软件设计模式中的一种经典模式,它保证了类只有一个实例存在,并提供一个全局访问点。在Java等面向对象编程语言中,单例模式常用于管理共享资源,如数据库连接池、线程池或者配置文件等。结合工厂模式,...

    Java实现单例模式[汇编].pdf

    单例模式是软件设计模式中的一种经典模式,其主要目的是确保一个类只有一个实例,并提供一个全局访问点。这种模式在Java中广泛应用于控制资源的共享,例如数据库连接池、线程池或者配置对象等。在Java中,通常有三种...

Global site tag (gtag.js) - Google Analytics