jsoup Document线程安全吗?

时间:2017-09-25 14:03:09

标签: java thread-safety jsoup

从多个线程使用jsoup someDocument.select(..)是否安全?读取操作是否存在内部状态?

1 个答案:

答案 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,因此在多个线程之间共享它的实例不会成为问题。