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

SingletonExample.java
package com.cnnct.test;
import java.util.concurrent.ConcurrentHashMap;
/**
 * 
 * @author rabbit
 * @date 2013-6-20 上午18:54:57
 * @email [email protected]
 * 
 */
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 [email protected]
 * 
 */
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

你可能感兴趣的:(单例)