Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/396.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_Synchronization - Fatal编程技术网

Java 在库/第三方类上同步?

Java 在库/第三方类上同步?,java,synchronization,Java,Synchronization,在Java中,在未编写的类类型的对象上显式同步通常被认为是安全的吗?我这样问是因为,如果该对象在内部尝试在自身上进行同步,那么另一个线程尝试使用该对象的非同步方法(该方法在内部获取对象的监视器)与线程显式获取对象上的锁之间可能会出现意外死锁。我从未听过或读过任何人说这是一个坏主意,尽管看起来可能是这样。我认为这个问题的答案归结为信任。您是否信任类编写器以不会发生您提到的问题的方式编写其对象?如果是,那就去做吧。如果没有,那么您已经给出了这可能导致问题的时间示例 如果“看起来这可能是个坏主意”,那

在Java中,在未编写的类类型的对象上显式同步通常被认为是安全的吗?我这样问是因为,如果该对象在内部尝试在自身上进行同步,那么另一个线程尝试使用该对象的非同步方法(该方法在内部获取对象的监视器)与线程显式获取对象上的锁之间可能会出现意外死锁。我从未听过或读过任何人说这是一个坏主意,尽管看起来可能是这样。

我认为这个问题的答案归结为信任。您是否信任类编写器以不会发生您提到的问题的方式编写其对象?如果是,那就去做吧。如果没有,那么您已经给出了这可能导致问题的时间示例

如果“看起来这可能是个坏主意”,那很可能是。线程是易变的,除非你能证明它是正确的,否则它很可能不是(除非完全是偶然的)


如果是我,我会很保守,不会在我没有完全控制的对象上同步,所以我可以确定它是正确的,不需要猜测。

Java允许您这样做,但不允许。您应该非常努力地将锁定封装在类中,或者封装在尽可能小的单元中

锁定您不完全拥有和理解的对象可能会导致死锁和其他混乱

查看并思考它如何应用于锁定第三方对象


此外,对于如何构造并发程序的全面、可读和高质量的讨论,必须参考。

对象不会无缘无故地尝试自身同步(除非您的第三方API是a)生成线程和b)做非常奇怪的事情)。基本上,当您进行所谓的“外来方法调用”时,问题就会出现。在有效的Java中,有人解释说,永远不要在锁定的情况下进行外来方法调用。