Java – which implementation is better: a cache based on weakhashmap or a cache based on ThreadLocal?
•
Java
It's hard for me to decide between the following two implementations
I have written two POC implementations and am glad to hear from the community pros / cons about each implementation
Thanks for your help.
Options #1 – weakhashmap
import java.io.IOException; import java.io.StringReader; import java.util.WeakHashMap; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class DocumentBuilder_WeakHashMap { private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); private static final WeakHashMap<Thread,DocumentBuilder> CACHE = new WeakHashMap<Thread,DocumentBuilder>(); public static Document documentFromXMLString(String xml) throws SAXException,IOException,ParserConfigurationException { DocumentBuilder builder = CACHE.get(Thread.currentThread()); if(builder == null) { builder = factory.newDocumentBuilder(); CACHE.put(Thread.currentThread(),builder); } return builder.parse(new InputSource(new StringReader(xml))); } }
Option #2 – ThreadLocal
import java.io.IOException; import java.io.StringReader; import java.lang.ref.WeakReference; import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; import org.w3c.dom.Document; import org.xml.sax.InputSource; import org.xml.sax.SAXException; public class DocumentBuilder_ThreadLocal { private static final DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance(); private static final ThreadLocal<WeakReference<DocumentBuilder>> CACHE = new ThreadLocal<WeakReference<DocumentBuilder>>() { @Override protected WeakReference<DocumentBuilder> initialValue() { try { return new WeakReference<DocumentBuilder>(factory.newDocumentBuilder()); } catch (Exception e) { throw new RuntimeException(e); } } }; public static Document documentFromXMLString(String xml) throws ParserConfigurationException,SAXException,IOException { WeakReference<DocumentBuilder> builderWeakReference = CACHE.get(); DocumentBuilder builder = builderWeakReference.get(); if(builder == null) { builder = factory.newDocumentBuilder(); CACHE.set(new WeakReference<DocumentBuilder>(builder)); } return builder.parse(new InputSource(new StringReader(xml))); } }
They all do the same thing (exposing documentfromxmlstring () to the outside world), which one would you use?
Thank you, Maxim
Solution
The ThreadLocal solution is better, as long as you do not use weak references, but directly use ThreadLocal < documentbuilder >
The content of this article comes from the network collection of netizens. It is used as a learning reference. The copyright belongs to the original author.
THE END
二维码