我是Java的新手,正在尝试学习synchronized语句的概念。以下代码和声明来自Java tutorial Oracle。
我的问题是,'nameList'变量是实例变量还是类变量?为什么它不包含在synchronised(this){}
声明中?我很难理解这个概念。
同步语句
创建同步代码的另一种方法是使用synchronized 声明。与synchronized方法不同,synchronized语句必须 指定提供内部锁的对象:
public void addName(String name) { synchronized(this) { lastName = name; nameCount++; } nameList.add(name); }
在此示例中,addName方法需要将更改同步到 lastName和nameCount,还需要避免同步 调用其他对象的方法。 (调用其他对象' 来自同步代码的方法可能会产生所描述的问题 在Liveness部分。)没有同步的声明,那里 唯一的,必须是一个单独的,不同步的方法 调用nameList.add。
的目的
答案 0 :(得分:3)
是'nameList'变量,是实例变量还是类变量?
你真的不需要知道。这是无关紧要的。
为什么它不包含在'synchronized(this){}“语句中?
因为必须假设nameList.add()已经是线程安全的,并且名称添加到列表中不需要在与其他两个指令相同的原子部分中进行。
但我同意这是一个很糟糕的例子。
这是一个更简单的希望更清楚:
public void addName(String name) {
synchronized(this) {
lastName = name;
nameCount++;
}
System.out.println("a name has been added");
}
您希望以原子方式执行两个第一条指令。但是你不关心在这个原子操作之后发生日志记录指令。并且您希望在执行日志记录指令时避免阻止其他线程获取锁定。因此,同步块非常有用:它使关键部分尽可能短。使方法同步会使临界区大于必要的范围。