Java 在不同对象上从另一个同步方法调用同步方法
假设我们有两个类A、B和相应类的同步方法methodA、methodB。如果我们从synchronized methodA调用synchronized methodB,那么当methodB仍在执行时,线程是否仍保持对ObjectA的锁定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
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
的同步方法。