Java单例类 demo

来源:互联网 发布:淘宝会员名字大全2016 编辑:程序博客网 时间:2024/06/10 19:16

不推荐使用Singleton1和Singleton2,Singleton3基本可以满足需求Singleton5支持延迟加载,但是实现稍麻烦,Effective Java 作者推荐通过枚举实现单例,自动支持序列化机制,防止反序列化重新创建新的对象,绝对防止多次实例化


通过枚举实现单例

package com.basic.designpatterns.create.singleton;/** * 单例 * * @author chichuduxing * @date 2017年2月4日 下午4:40:22 */class Resource {// 具体业务.public void doSomeThing() {System.out.println("working");}}/** * 通过枚举类实现(枚举类中构造必须是私有的) 支持线程安全,支持序列化 */public enum EnumSingleton {INSTANCE;private Resource instance = null;private EnumSingleton() {instance = new Resource();}public Resource getInstance() {return instance;}}


通过枚举实现单例,但是不暴露细节的单例类

package com.basic.designpatterns.create.singleton;/** * @author chichuduxing * @date 2017年4月3日 下午7:54:42 */public class EnumFactory {/** * 对外的获取单例的方法 * * @return 单例对象 */public static SingResource getInstance() {return EnumSingleton.INSTANCE.getInstance();}/** * 通过枚举类实现(枚举类中构造必须是私有的) 支持线程安全,支持序列化 */private enum EnumSingleton {INSTANCE;private SingResource instance = null;private EnumSingleton() {instance = new SingResource();}public SingResource getInstance() {return instance;}}/** * 测试方法 * * @param args */public static void main(String[] args) {EnumFactory.getInstance().doSomeThing();}}/** * 具体实现功能的单例类 */class SingResource {public SingResource() {}// 具体业务.public void doSomeThing() {System.out.println("working");}}



其他若干种实现方式

package com.basic.designpatterns.create.singleton;/** * 单例模式 * * @author chichuduxing * @date 2017年2月4日 上午11:19:02 *//** * 懒汉式,线程不安全 */class Singleton1 {private Singleton1() {}private static Singleton1 instance = null;public static Singleton1 getInstance() {if (null == instance) {return new Singleton1();}return instance;}}/** * 懒汉式,线程安全 效率低 */class Singleton2 {private Singleton2() {}private static Singleton2 instance = null;public static synchronized Singleton2 getInstance() {if (null == instance) {return new Singleton2();}return instance;}}/** * 饿汉式,(单个ClassLoader时线程安全) 无锁,线程安全,但是类加载时就会new对象. */class Singleton3 {private Singleton3() {}private static Singleton3 instance = new Singleton3();public static Singleton3 getInstance() {return instance;}}/** * 双重锁校验 懒汉式,线程安全.需要加volatile关键字</br> * 因为instance = new Singleton4();并不是原子的操作,</br> * 如果处理器进行重排序后可能早晨instance虽然不为null了,但是实例还没初始化</br> */class Singleton4 {private Singleton4() {}// 必选加volatile关键字private volatile static Singleton4 instance = null;public static Singleton4 getInstance() {if (instance == null) {synchronized (Singleton4.class) {if (null == instance) {instance = new Singleton4();}}}return instance;}}/** * 内部类,内部类是延时加载的,只会在第一次使用时加载,不使用就不加载。 懒汉式,线程安全. */class Singleton5 {private Singleton5() {}static class InnerSingleton {private static final Singleton5 instance = new Singleton5();}public static final Singleton5 getInstance() {return InnerSingleton.instance;}}public class SingletonPatternDemo {// 推荐EnumSingleton// 其次Singleton5public static void main(String[] args) {EnumSingleton.INSTANCE.getInstance().doSomeThing();}}





0 0
原创粉丝点击