Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 一个类的两个实例可以并行调用方法(在某个对象上同步)_Java - Fatal编程技术网

Java 一个类的两个实例可以并行调用方法(在某个对象上同步)

Java 一个类的两个实例可以并行调用方法(在某个对象上同步),java,Java,我有这样一种方法: 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));

我有这样一种方法:

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));
        }
    }
  }
public void processChildNodes(节点结果、节点源){
已同步(源){
NodeList nodes=source.getChildNodes();
对于(int i=0;i

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

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

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

编辑


我做了更多的研究,发现它描述了参数是如何工作的。根据这些新信息,我认为我的答案是无效的,但我仍然不能100%确定。

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


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

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

这并不完全正确。Java将向节点传递指针的副本。因此,节点的值是共享的,而不是副本。因此,你将在同一个对象上同步。好极了,你有勇气承认错误。。[至少只要你保持匿名…]是的,我最初的回答是基于直觉。不过,这是一个棘手的问题。我将不得不编写一些测试来解决这个问题,以供经验。如果您了解C,请将java引用视为C指针。调用函数时
f(obj)
函数
f
正在接收指向对象的指针(java引用)的值。对象本身没有被复制。嗯,我同意你的看法,但根据我所看到的行为,似乎同步块在使用两个不同类对象和同一源对象调用方法时并行执行。你能分享创建节点对象的代码以及调用processChildNodes的代码吗?是的,我当然会有时共享为什么这与在单个对象上同步有什么不同?由于“source”在两个调用中都引用同一个对象,因此它的行为与在单个对象上进行同步相同。为什么会出现混乱?