PerThreadSingleton.java 源代码


package org.dom4j.util;

import java.lang.ref.WeakReference;

public class PerThreadSingleton implements SingletonStrategy {
    private String singletonClassName = null;
    private ThreadLocal perThreadCache = new ThreadLocal();

    @Override
    public void reset() {
        this.perThreadCache = new ThreadLocal();
    }

    @Override
    public Object instance() {
        Object obj;
        WeakReference weakReference = (WeakReference) this.perThreadCache.get();
        if (weakReference == null || weakReference.get() == null) {
            try {
                try {
                    obj = Thread.currentThread().getContextClassLoader().loadClass(this.singletonClassName).newInstance();
                } catch (Exception unused) {
                    obj = Class.forName(this.singletonClassName).newInstance();
                }
            } catch (Exception unused2) {
                obj = null;
            }
            this.perThreadCache.set(new WeakReference(obj));
            return obj;
        }
        return weakReference.get();
    }

    @Override
    public void setSingletonClassName(String str) {
        this.singletonClassName = str;
    }
}