2 回答

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

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