gpt4 book ai didi

java - 哪个实现更好 : Cache based on WeakHashMap or cache based on ThreadLocal?

转载 作者:塔克拉玛干 更新时间:2023-11-01 21:31:38 26 4
gpt4 key购买 nike

我很难在以下两种实现之间做出决定。我想为每个线程缓存 javax.xml.parsers.DocumentBuilder 对象。我主要关心的是运行时性能 - Hench 我很乐意尽可能避免 GC。内存不是问题。

我已经编写了两个 POC 实现,很乐意听取社区关于每个实现的优缺点。

谢谢大家的帮助。

选项 #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)));
}

}

选项#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)));
}
}

它们都做同样的事情(将 documentFromXMLString() 暴露给外界)那么你会使用哪一个?

谢谢,格言。

最佳答案

只要您不使用弱引用而是直接使用 ThreadLocal<DocumentBuilder>,ThreadLocal 解决方案会更好。 .访问 ThreadLocal 值的速度更快,因为线程直接引用包含所有 ThreadLocal 值的数组,并且它只需计算该数组中的索引即可进行查找。查看ThreadLocal source看看为什么索引计算很快(int index = hash & values.mask;)

关于java - 哪个实现更好 : Cache based on WeakHashMap or cache based on ThreadLocal?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3139914/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com