当 setter 位于父对象上时,子对象的线程安全性

问题描述 投票:0回答:1

以下示例代码在多线程环境中创建新的 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");
java multithreading thread-safety
1个回答
0
投票

继承线程安全是正交主题。

此代码:

var child = new ChildClass()
child.setFirstName("Jo");
child.setFamilyName("Smith");

…如果所有三行都在同一个线程中执行,则它是线程安全的。

共享资源会产生线程安全问题。在本例中,您有一个新的

ChildClass
实例。是新的意味着到目前为止,它不与任何其他线程共享。您可以通过同一实例上的 setter 方法访问其包含的字段,因此没有其他线程意味着没有跨线程共享资源,这意味着没有线程安全问题。

在子类上定义两个 setter 而在超类上定义另一个 setter 的事实不会影响线程安全。您可以将这两个类视为合并在一起,超类内容折叠到子类中。

就线程安全而言,定义所有三个 setter 的单个类与定义两个 setter 且另一个定义单个 setter 的一对类之间没有区别。

© www.soinside.com 2019 - 2024. All rights reserved.