Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading_Synchronization - Fatal编程技术网

Java 在不同对象上从另一个同步方法调用同步方法

Java 在不同对象上从另一个同步方法调用同步方法,java,multithreading,synchronization,Java,Multithreading,Synchronization,假设我们有两个类A、B和相应类的同步方法methodA、methodB。如果我们从synchronized methodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍保持对ObjectA的锁定 Class A { public synchronized void methodA() { //do something; synchronized(ObjectB) { ObjectB

假设我们有两个类A、B和相应类的同步方法methodA、methodB。如果我们从synchronized methodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍保持对ObjectA的锁定

Class A
{
   public synchronized void methodA()
   {
       //do something;
       synchronized(ObjectB)
       {
          ObjectB.methodB();
       }
   }
}

Class B
{
   public synchronized void methodB()
   {
      //do something
   }
}

只要您处于同步块中,锁就会一直保持。可以根据需要锁定任意多个锁,但这种嵌套同步可能会影响应用程序的整体性能。

只要您处于同步块中,锁就会一直保持。可以根据需要锁定任意多个锁,但这种嵌套同步可能会影响应用程序的整体性能。

您应该解决这个问题,但线程在获取新锁时不会释放其他锁。它只在退出同步部件或等待时才释放锁。您能给出一个更完整的工作示例吗?看起来好像有3个同步正在进行,一个是A的实例,一个是ObjOfClassB实例,另一个是ObjectB实例。@fedup My bad。ObjectB和ObjectB是相同的。我已经更正了代码。
methodA()
中的内部同步是冗余的。然而,当您拥有这种类型的东西时,您必须确保每个人都以相同的顺序获取锁,否则将导致死锁。例如,如果
methodB()
调用了
a
的同步方法,您应该解决这个问题,但是线程在获取新锁时不会释放其他锁。它只在退出同步部件或等待时才释放锁。您能给出一个更完整的工作示例吗?看起来好像有3个同步正在进行,一个是A的实例,一个是ObjOfClassB实例,另一个是ObjectB实例。@fedup My bad。ObjectB和ObjectB是相同的。我已经更正了代码。
methodA()
中的内部同步是冗余的。然而,当您拥有这种类型的东西时,您必须确保每个人都以相同的顺序获取锁,否则将导致死锁。例如,如果
methodB()
调用了
a
的同步方法。