繁体   English   中英

方法调用与同步块之间的“差距” —避免并发死锁

[英]“gap” between method call and the synchronized block — avoiding deadlock in concurrency

以下方法是SomeType类的方法-它作为其参数的类型。 行注释指示行号。

synchronized void someMethod(SomeType other) {  // line 1
                                // line 2
    synchronized (other) {      // line 3
        //...do stuff           // line 4
    }
}

指示为“第4行”的块调用了thisother一些其他同步方法,并且此代码旨在避免死锁。

但是-假设同时a.someMethod(b)b.someMethod(a) ,其中ab是不同的实例。

进一步假设b.someMethod(a)被调用后立即a.someMethod(b)是,他们都在行举行了2--每ab获得自己的锁,并等待对方的锁进行。

可以/不可以吗?

如果是这样-在哪些JDK实现上? 除非依赖于jdk规范,否则这似乎取决于特定的实现。

TIA

是的,您描述的僵局可能会发生。 它发生的频率可能取决于线程代码的细节。 如今,您最有可能使用操作系统的本机线程,因此它将比JDK / JRE更依赖本机OS。 不过,在大多数平台上都有可能发生死锁,因此您应该在代码中加以防范。

如果您认为该方法的争用程度很低,或者您不关心性能,则可以在静态成员或类本身上进行同步,而不是在对象上进行同步。 如果您确实关心性能,并且认为争用会很重要,那么您将需要找出一种方法,以确保监视器以相同的顺序锁定,而与调用该方法的对象以及方法的参数无关。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM