我有大量的线程使用静态变量,它在一个synchronized块中被懒惰地初始化。初始化是内存密集型的,所以理想情况下只想这样做一次。我理解线程访问自己的静态变量的缓存副本,但它在缓存之前需要一些时间,所以最初每个线程都进入初始化块。即使它已同步,也可能导致内存不足错误。
有没有办法强制静态变量在第一个线程初始化后立即可用于所有新线程?
代码(简化):
class TestingThread extends Thread {
private static Templates transformTemplateRequest = null;
private static final Object lockObj = new Object();
private Document xslt;
public void run() {
//Document xslt initialized
Transformer requestTransformer = null;
synchronized (lockObj) {
if (transformTemplateRequest == null) {
TransformerFactory tf = TransformerFactory.newInstance();
Source xsltSource = new DOMSource(xslt);
transformTemplateRequest = tf.newTemplates(xsltSource);
}
}
requestTransformer = transformTemplateRequest.newTransformer();
//other work
}
}
答案 0 :(得分:1)
如果是stmt:
,我只是把它换成另一个if (transformTemplateRequest == null) {
synchronized (lockObj) {
if (transformTemplateRequest == null) {
TransformerFactory tf = TransformerFactory.newInstance();
Source xsltSource = new DOMSource(xslt);
transformTemplateRequest = tf.newTemplates(xsltSource);
}
}
}
如果已经设置了变量,则完全绕过synchronized块。