从多个线程使用jsoup someDocument.select(..)
是否安全?读取操作是否存在内部状态?
答案 0 :(得分:2)
即使Document.select(String cssSelector)
类不是线程安全的,您也可以从多个线程安全地调用Document
。 .select(String cssSelector)
方法的基础实现传递了对调用此方法的元素的引用(在本例中为Document
对象),但它不会调用任何更改调用方状态的方法。
当您致电.select(String cssSelector)
时,您实际上会调用Collector.collect(Evaluator eval, Element root)
方法,其中root
实例是对Document
对象的引用。
/**
Build a list of elements, by visiting root and every descendant of root, and testing it against the evaluator.
@param eval Evaluator to test elements against
@param root root of tree to descend
@return list of matches; empty if none
*/
public static Elements collect (Evaluator eval, Element root) {
Elements elements = new Elements();
new NodeTraversor(new Accumulator(root, elements, eval)).traverse(root);
return elements;
}
在此方法中,只有elements
对象得到更新。
Document
类不是线程安全的? Document
类中有一些方法允许在没有任何同步机制的情况下更改对象的状态,例如Document.outputSettings(Document.OutputSettings outputSettings)
。在最好的情况下,Document
类应该是final和immutable,因此在多个线程之间共享它的实例不会成为问题。