gpt4 book ai didi

java - 'nameList' 变量是实例变量还是类变量?为什么不包含在 'synchronised(this){}"语句中呢?

转载 作者:行者123 更新时间:2023-11-29 04:50:49 24 4
gpt4 key购买 nike

我是 Java 的新手,正在尝试学习同步语句的概念。下面的代码和语句来自 Java tutorial Oracle .

我的问题是,“nameList”变量是实例变量还是类变量?为什么它不包含在 synchronized(this){} 语句中?我很难理解这个概念。

Synchronized Statements

Another way to create synchronized code is with synchronized statements. Unlike synchronized methods, synchronized statements must specify the object that provides the intrinsic lock:

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

In this example, the addName method needs to synchronize changes to lastName and nameCount, but also needs to avoid synchronizing invocations of other objects' methods. (Invoking other objects' methods from synchronized code can create problems that are described in the section on Liveness.) Without synchronized statements, there would have to be a separate, unsynchronized method for the sole purpose of invoking nameList.add.

最佳答案

is the 'nameList' variable an instance variable or class variable?

你真的不需要知道。这无关紧要。

Why is it not included in the 'synchronised(this){}" statement?

因为必须假设 nameList.add() 已经是线程安全的,并且不需要在与其他两条指令相同的原子部分中将名称添加到列表中。

但我同意这是一个很糟糕的例子。

这是一个更简单的,希望更清楚:

public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
System.out.println("a name has been added");
}

您希望以原子方式执行前两条指令。但是你不关心日志记录指令发生在这个原子操作之后。并且您希望在执行日志记录指令时避免阻止其他线程获取锁。 synchronized block 因此很有用:它使临界区尽可能短。使方法同步会使临界区比必要的更大。

关于java - 'nameList' 变量是实例变量还是类变量?为什么不包含在 'synchronised(this){}"语句中呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35480736/

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