`
高军威
  • 浏览: 175090 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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语言,主要实现了六种单例的生成方法,包括懒汉式、饿汉式、双重校验锁、枚举、静态内部类,可以根据实际情况选择使用

    java单例模式实例

    一个简单的java工程,包含注释,一目了然,其中包含了单例模式的所有实现方式,懒汉式,饿汉式,双重校验,枚举,静态内部类等方式实现单例。

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

    详细讲解了Java单例模式的几种实现方式,并有详细的示例配合讲解.

    单例模式各种实现方式

    java单例模式的实现方式

    单例模式Java实现

    单例模式是最简单的一种设计模式,确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例, 本资源提供了用java语言实现简单的单例模式,供初学者参考

    7种单例模式

    设计模式之七种单例模式代码及ppt,包含多线程环境测试和反序列化测试

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

    单例模式和工厂模式结合应用,实现了产品的生产,适合用做课程设计,包含详细文档和代码。Java语言。喜欢的可以下载来看看那

    Java 单例模式.pptx

    作为对象的创建模式, 单例模式确保某一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。 PPT详细了单例模式的实现和使用场景

    Java设计模式之单例模式

    目录 单例模式的概念 单例模式的要点 单例模式类图 单例模式归类 单例模式的应用场景 单例模式解决的问题 单例模式的实现方式 单例模式实现方式对比 单例模式的概念 单例模式,顾名思义就是只有一个实例,并且由它...

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

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

    单例模式的多种实现.docx

    单例模式的七种实现方法以及分析,可以作文大作业提交 ...3.6使用静态内部类实现单例模式 12 3.7使用枚举类实现单例模式 13 4.单例模式怎么用才合理? 14 4.1测试 14 4.2无边界 15 5.设计模式学习总结: 15

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等

    基于Java实现的23种设计模式Demo,抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式、外观模式、适配器模式等 Java设计模式共有23种,分别为:抽象工厂模式、建造模式、工厂方法模式、原型模式、单例模式...

    单例模式各种实现及分享

    java单例模式的多种实现方法及优劣区分,以及如何摧毁单例模式。能够让大家认识到单例的多种多样

    java单例模式及实现

    java单例模式及实现

    Java设计模式之单例模式讲解

    主要讲了单例模式的几种方法,懒汉模式、饿汉模式、静态内部类模式。着重讲解了懒汉模式下怎么实现线程安全。饿汉模式和静态内部类模式如何设置能够避免使用反射方法获取多个实列,以及实现了序列化的类如何避免创建...

    java单例模式连接数据库源码

    java单例模式连接数据库源码.可以直接引用只需加入相应的mysql 或 oracle的驱动,修改源码的连接地址用户名及密码。

    单例模式与装饰着模式.md

    通过学习java 简单总结单例模式与装饰者模式,做一下入门总结,主要讲述单例模式中饿汉式与懒汉式的相同点与不同点,方便理解记忆。

Global site tag (gtag.js) - Google Analytics