以下示例代码在多线程环境中创建新的 Child 对象时是否线程安全 一些 setter 位于父级上。
public abstract class ParentClass {
private String familyName;
public Strng getFamily() {
return familyName;
}
public void setFamily (String familyName) {
return this.familyName = familyName
}
public class ChildClass extends ParentClass {
private String firstName;
public String getFirstName() {
return firstName;
}
public void setFirstName (String firstName) {
return this.firstName = firstName
}
现在,当我如下所示创建一个新的 Child 时,在应用程序中处理子对象时,setter (setFamily) 是否是线程安全的
var child = new ChildClass()
child.setFirstName("Jo");
child.setFamilyName("Smith");
此代码:
var child = new ChildClass()
child.setFirstName("Jo");
child.setFamilyName("Smith");
…如果所有三行都在同一个线程中执行,则它是线程安全的。
共享资源会产生线程安全问题。在本例中,您有一个新的
ChildClass
实例。是新的意味着到目前为止,它不与任何其他线程共享。您可以通过同一实例上的 setter 方法访问其包含的字段,因此没有其他线程意味着没有跨线程共享资源,这意味着没有线程安全问题。
在子类上定义两个 setter 而在超类上定义另一个 setter 的事实不会影响线程安全。您可以将这两个类视为合并在一起,超类内容折叠到子类中。
就线程安全而言,定义所有三个 setter 的单个类与定义两个 setter 且另一个定义单个 setter 的一对类之间没有区别。