2 回答

TA貢獻1847條經驗 獲得超11個贊
像 Transformer 這樣的 JAXP 類是接口,并且它們有多種實現(目前使用最廣泛的兩個是 Xalan 和 Saxon)。打破多線程規則的實際效果將取決于您使用的處理器;但在這兩種情況下,它們都是相當不可預測的。Transformer 可能保存變量和動態執行上下文的當前狀態,因此您確實不希望兩個轉換重寫彼此的變量。
為了避免每次使用時重新編譯樣式表的成本,您需要緩存 Templates 對象,而不是 Transformer 對象。理論上,您可以連續重用 Transformer 在單個線程中連續執行多個轉換,但這沒有意義:只需為每個新轉換創建一個新的 Transformer(從緩存的模板)。
另一件需要注意的事情是 DOM 不是線程安全的,即使在只讀模式下也是如此。不允許兩個轉換同時訪問同一棵 DOM 樹。如果您確實需要在多個轉換之間共享源文檔,那么最好的方法最終取決于您使用的是 Xalan 還是 Saxon。

TA貢獻1862條經驗 獲得超7個贊
要編譯和緩存固定代碼,請使用newTemplates
創建Templates
對象,https://docs.oracle.com/javase/8/docs/api/javax/xml/transform/TransformerFactory.html#newTemplates-javax.xml.transform.Source -,然后為多線程環境中的每次執行使用newTransformer
該Templates
對象創建一個新的Transformer
.
添加回答
舉報