代码之家  ›  专栏  ›  技术社区  ›  ACHC

确保所有线程立即缓存静态变量

  •  2
  • ACHC  · 技术社区  · 8 年前

    我有很多使用静态变量的线程,静态变量在同步块中延迟初始化。初始化是内存密集型的,因此理想情况下只希望执行一次。我知道线程访问自己缓存的静态变量副本,但在缓存之前需要一些时间,因此最初每个线程都进入初始化块。即使它是同步的,这也会导致内存不足错误。

    有没有办法强制静态变量在第一个线程初始化后立即对所有新线程可用?

    代码(简化):

    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
        }
    }
    
    1 回复  |  直到 8 年前
        1
  •  1
  •   Chris Gerken    8 年前

    我就用另一个if stmt包起来:

    if (transformTemplateRequest == null) {
        synchronized (lockObj) {
            if (transformTemplateRequest == null) {
                TransformerFactory tf = TransformerFactory.newInstance();
                Source xsltSource = new DOMSource(xslt);
                transformTemplateRequest = tf.newTemplates(xsltSource);
            }
        }
    }
    

    如果变量已设置,则完全绕过同步块。