gpt4 book ai didi

java - 为什么 nameList.add 不同步?

转载 作者:行者123 更新时间:2023-12-03 12:47:58 25 4
gpt4 key购买 nike

以下是 Oracle Java 教程中的一小段文字:

“同步语句”

创建同步代码的另一种方法是使用同步语句。与同步方法不同,同步语句必须指定提供内部锁的对象:

public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
nameList.add(name);
}

在这个例子中,addName 方法需要同步对 lastName 和 nameCount 的更改,但也需要避免同步调用其他对象的方法。 (从同步代码调用其他对象的方法可能会产生一些问题,这些问题在有关 Liveness 的部分中有所描述。)如果没有同步语句,就必须有一个单独的、非同步的方法,其唯一目的是调用 nameList.add。

我理解他们关于 Synchronized 提供的灵 active 的观点。但是为什么 Oracle 决定 nameList.add 不需要同步呢?更一般地说,我如何确定哪些对象方法需要同步,哪些不需要?

最佳答案

同步有它的代价,性能方面。一般的经验法则(JDK 本身也遵循,在这种情况下也是如此)是除非绝对需要,否则不要同步。

由于在很多情况下您希望在不需要同步的情况下将元素添加到列表中(例如,如果所述列表是局部变量),它没有被定义为同步的。当你需要同步这样的操作时,你总是可以使用 CopyOnWWriteArrayList ,或显式同步您的访问权限。

关于java - 为什么 nameList.add 不同步?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26195563/

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