4

我有一个方法:

public void processChildNodes(Node result, Node source) {
    synchronized (source) {
        NodeList nodes = source.getChildNodes();
        for (int i = 0; i < nodes.getLength(); i++) {
          processNode(result, nodes.item(i));
        }
    }
  }

现在假设我正在尝试使用具有相同源(方法的第二个参数)的类的两个不同实例调用 processChildNodes,这两个执行是否可以并行执行?

4

4 回答 4

2

不,该方法将被调用,但同步块中的内容不会被并行执行。这是因为正如您所提到的,您使用的是相同的源对象。由于在对象上获得了锁,因此同步将正常工作。

于 2013-05-14T05:43:03.527 回答
2

您正在尝试获取对象锁定。如果您传递相同的对象,那么您的处理将被同步,这意味着一个线程将执行同步块内的代码,而另一个线程将等待它。但是如果你传递两个不同的对象,那么它们将使用两个不同的锁,这意味着它们不依赖于彼此来获取锁。所以它们都将并行执行。

当您编写代码并尝试使用源对象同步执行时。因此,请确保您的两个线程都使用相同的源对象来获得所需的结果。

于 2013-05-14T05:51:52.237 回答
1

因为您是使用源对象进行同步,所以同步应该可以正常工作。如果两个实例中使用的对象不同,则两个执行可能会并行发生。

于 2013-05-14T06:18:15.063 回答
0

Java 是按值传递的,这意味着Node传递的实际上是一个副本。系统为对该方法的两个单独调用制作两个单独的副本,这意味着两者将并行执行。请注意,这也意味着您的同步块可能无效。小心数据竞争。

编辑

我做了更多的研究,发现这个页面描述了参数的工作原理。鉴于这些新信息,我认为我的答案是无效的,但我仍然不能 100% 确定。

于 2013-05-14T05:43:08.747 回答