gpt4 book ai didi

java - 如果一个方法是同步的,那么被调用的方法是否也必须同步?

转载 作者:行者123 更新时间:2023-12-04 07:18:10 25 4
gpt4 key购买 nike

如果一个方法是同步的,被调用的方法是否也必须同步?下面的例子中什么是正确的?

// Only parent method synchronized 
public synchronized void parentMethod() {
childMethod1();
}

public void childMethod1() {
childMethod2();
}

public void childMethod2() {

}



// All methods synchronized
public synchronized void parentMethod() {
childMethod1();
}

public synchronized void childMethod1() {
childMethod2();
}

public synchronized void childMethod2() {

}

最佳答案

If a method is synchronized, do the called methods also have to be synchronized?


不。
没有一般理由需要调用 synchronized另一个方法 synchronized方法。
假设这些方法在同一个对象上同步,那么所有模式都是有效的,具体取决于您要实现的目标:
  • 调用synchronized来自 synchronized 的方法方法
  • 调用synchronized来自普通方法的方法
  • synchronized 调用普通方法方法
  • 从普通方法调用普通方法

  • 除了最后一种情况,被调用的方法将持有目标对象的锁。
    (在第一种情况下,看起来好像线程要访问同一个对象两次。事实上,Java 原始锁是可重入的……所以这不是问题。)

    如果方法调用在不同的目标对象上,它会变得有点复杂。现在您必须考虑您的应用程序是否需要锁定两个对象。您还需要考虑死锁的可能性。 (如果两个线程试图同时获取相同的两个原始锁,但顺序不同,则会出现死锁。)

    实际上不可能给出关于哪些方法需要同步的硬性规则1。这取决于方法的作用,以及您是否使用原始锁互斥锁或其他一些机制( Lockvolatile、不可变类型等)来同步和/或确保内存可见性。即使对于原始锁互斥体,您也可以使用 synchronized synchronized的方法 block 来实现同样的事情。

    1 - 请注意,这个问题无论如何都不会问这个!

    关于java - 如果一个方法是同步的,那么被调用的方法是否也必须同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68663648/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com