`

关于使用枚举方式单例对象

 
阅读更多
SingletonExample.java
package com.cnnct.test;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 
 * @author rabbit
 * @date 2013-6-20 上午18:54:57
 * @email renntrabbit@foxmail.com
 * 
 */
public enum SingletonExample {
	INSTANCE;
	public static SingletonExample getInstance() {
		return INSTANCE;
	}

	private static final ConcurrentHashMap<String, Object> MAP = new ConcurrentHashMap<String, Object>();
	private Object o;

	public Object getObject(Class<?> clz) throws InstantiationException, IllegalAccessException {
		String key = clz.getName().toUpperCase();
		o = MAP.get(key);
		if (o == null) {
			o = clz.newInstance();
			MAP.put(key, o);
		}
		return o;
	}
}

多线程测试
package com.cnnct.test;

import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
/**
 * 
 * 
 * @author rabbit
 * @date 2013-6-20 上午19:54:57
 * @email renntrabbit@foxmail.com
 * 
 */
public class Test {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException {
		Class<?>[] clz = new Class<?>[] { String.class, ConcurrentHashMap.class, Test.class };
		ExecutorService executorService = Executors.newCachedThreadPool();
		for (int c = 0; c < 20; c++) {
			executorService.execute(new TestRun(clz));
		}
		executorService.shutdown();
		try {
			executorService.awaitTermination(Long.MAX_VALUE, TimeUnit.NANOSECONDS);
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
	public static class TestRun implements Runnable {
		private Class<?>[] clz;
		public TestRun(Class<?>[] clz) {
			this.clz = clz;
		}
		public void run() {
			try {
				for (Class<?> c : clz) {
					Object o = SingletonExample.getInstance().getObject(c);
					System.out.println(o.getClass() + "@" + o.hashCode());
				}

			} catch (InstantiationException e) {
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				e.printStackTrace();
			}
		}

	}
}


打印结果:
class java.lang.String@0
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class java.lang.String@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.lang.String@0
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class java.lang.String@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class java.lang.String@0
class com.cnnct.test.Test@2583282
class com.cnnct.test.Test@2583282
class java.lang.String@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.lang.String@0
class java.lang.String@0
class java.lang.String@0
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282
class java.util.concurrent.ConcurrentHashMap@0
class com.cnnct.test.Test@2583282

分享到:
评论

相关推荐

    Java+单例+多例+工厂+枚举+动态代理===》演示

    单例设计模式案例演示 单例模式,是一种常用的软件设计模式。通过单例模式可以保证系统中,**应用该模式的这个类只有一个实例**。即一个类只有一个对象实例...枚举的定义和使用 工厂设计模式案例演示 动态代理案例演示

    Java枚举类的使用与注解

    2.当需要定义一组常量时,强烈建议使用枚举类。 3.如果枚举类中只有一个对象,则可以作为单例模式的实现方式。 二、如何定义枚举类 方式一:Jdk5.0之前,自定义枚举类 方式二:jdk5.0之后,可以使用enum关键字定义...

    一个单例模式的晋级过程(饿汉-懒汉-DCL-IoDH-枚举)

    一个单例模式的晋级过程...枚举实现单例使用推荐 什么是单例? 单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 这种模式涉及到一

    这可能是最全的单例模式了

    完全不使用synchronized实现单例模式1. CAS(AtomicReference)实现单例模式2. ThreadLocal实现单例模式如何破坏单例如何防止单例被破坏参考文章 单例模式有以下特点:  1、单例类只能有一个实例。  2、单例类必须...

    JAVA面向对象详细资料

    40.4 使用枚举优化披萨工厂 67 40.5 枚举类型也可以有构造方法 68 40.6 枚举类型也可以有属性 68 40.7 枚举类型也支持带参数的构造方法。 68 40.8 枚举类型也可以有实例方法 68 40.9 枚举类型也可以支持抽象方法 69 ...

    【设计模式】(四)–创建型模式–单例模式

    【设计模式】(四)–创建型模式–单例模式单例模式的定义饿汉式单例模式懒汉式单例模式饿汉式与懒汉式的区别:单例模式的优点单例模式的缺点Java中其他生成单例的方式使用Spring框架...

    DesignPattern:Java设计模式

    只要应用中不使用内部类 JVM 就不会去加载这个单例类,也就不会创建单例对象,从而实现懒汉式的延迟加载和线程安全。 饿汉模式 否 慢 快 是 单例对象初始化非常快,而且占用内存非常小的时候这种方式是比较合适的,...

    【05-面向对象(下)】

     –在外部类以外的地方使用非静态内部类创建对象的语法如下:OuterInstance.new InnerConstructor()  –在外部类以外的地方使用静态内部类创建对象的语法如下:new OuterClass.InnerConstructer(); 局部内部类 ...

    OBJECTIVE-C编程之道 IOS设计模式解析电子书+源代码

    迭代器14.1 何为迭代器模式14.2 何时使用迭代器模式14.3 在Cocoa Touch框架中使用迭代器模式14.3.1 NSEnumerator14.3.2 基于块的枚举14.3.3 快速枚举14.3.4 内部枚举14.4 遍历Scribble的顶点14.5 总结第六部分 ...

    超级有影响力霸气的Java面试题大全文档

     ArrayList 和Vector都是使用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,它们都允许直接按序号索引元素,但是插入元素要涉及数组元素移动等内存操作,所以索引数据快而插入数据慢,...

    java简易版开心农场源码-GOF23:一起来学习设计模式吧~

    则可以通过在应用启动时直接产生一个单例对象, 然后永久驻留内存的方式来解决 单例模式可以在系统设置全局的访问点, 优化共享资源访问, 例如可以设计一个单例类, 负责所有数据表的映射 常见的五种单例模式实现方法: ...

    实验1 Java环境搭建.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Android设计模式之单例模式详解

    枚举单例 饿汉式 加载类的同时立即进行初始化操作,对资源消耗很大 public class SingleTest { public static final SingleTest singleTest1=new SingleTest(); public SingleTest() { } public static ...

    day020-继承加强和设计模式代码和笔记.rar

    step4:在我们代码中通过创建对象或者类名的方式使用即可 3.2 使用自己的jar包 (造轮子) step1:选中自己想要封装成jar包的类,右键export导出 在输入框中输入 jar: 1. jar File : 普通...

    疯狂JAVA讲义

    学生提问:使用组合关系来实现复用时,需要创建两个Animal对象,是不是意味着使用组合关系时系统开销更大? 159 5.9 初始化块 159 5.9.1 使用初始化块 160 5.9.2 初始化块和构造器 161 5.9.3 静态初始化块 162 ...

    实验9 Servlet.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    Java实验6多线程.doc

    本专栏主要为Java程序设计(基础)实验报告和Java程序设计(进阶)...进阶篇有反射、泛型、注解、网络编程、多线程、序列化、数据库、Servlet、JSP、XML解析、单例模式与枚举。本专栏主要为Java入门者提供实验参考。

    koverage:Kotlin的100%代码覆盖率

    灭绝 Kotlin数据类和其他生成的kotlin代码的100%代码覆盖率。 这是一个已知的问题,Kotlin会在后台生成大量代码,并且标准的覆盖技术无法应对这些路径。...单例对象 去做 这不是经过充分测试的。 有一

    Java核心技术II(第8版)

    1.5.3 序列化单例和类型安全的枚举 1.5.4 版本管理 1.5.5 为克隆使用序列化 1.6 文件管理 1.7 新I/O 1.7.1 内存映射文件 1.7.2 缓冲区数据结构 1.7.3 文件加锁机制 1.8 正则表达式 第十二章 XML 2.1 XML概述 2.1.1 ...

    2019千峰Python超详细入门教程(百度云盘分享).docx

    单例的三种实现方式&__repr__&__str__&继承概述1.mp4 │ 千锋Python教程:76.单例的三种实现方式&__repr__&__str__&继承概述2.mp4 │ 千锋Python教程:77.继承的实现&继承体系&栈和队列&python2;.2之前的...

Global site tag (gtag.js) - Google Analytics