gpt4 book ai didi

java - 在 Java 关键部分中,我应该同步什么?

转载 作者:IT老高 更新时间:2023-10-28 13:51:06 24 4
gpt4 key购买 nike

在 Java 中,在代码中声明临界区的惯用方式如下:

private void doSomething() {
// thread-safe code
synchronized(this) {
// thread-unsafe code
}
// thread-safe code
}

几乎所有 block 都在 this 上同步,但这有什么特别的原因吗?还有其他可能性吗?关于要同步的对象是否有任何最佳实践? (比如 Object 的私有(private)实例?)

最佳答案

正如之前的回答者所指出的,最佳做法是在有限范围的对象上进行同步(换句话说,选择您可以摆脱的最严格的范围并使用它。)特别是在 上进行同步这个是个坏主意,除非你打算让你的类的用户获得锁。

但是,如果您选择在 java.lang.String 上进行同步,则会出现一个特别难看的情况。字符串可以(并且在实践中几乎总是)被实习。这意味着在 ENTIRE JVM 中每个内容相同的字符串在幕后都是相同的字符串。这意味着如果您在任何字符串上进行同步,另一个(完全不同的)代码部分也锁定了具有相同内容的字符串,实际上也会锁定您的代码。

我曾经在生产系统中解决死锁问题,并且(非常痛苦地)将死锁跟踪到两个完全不同的开源包,每个包都在一个 String 的实例上同步,其内容都是 "LOCK" .

关于java - 在 Java 关键部分中,我应该同步什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/416183/

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