父类含Setter方法的子类对象在多线程环境下是否线程安全?
多线程环境下子类对象创建与父类Setter方法的线程安全性分析
首先纠正你代码里的几处语法错误,否则代码无法正常编译:
ParentClass中getFamily方法的返回值类型拼写错误,应为String而非Strng- 两个Setter方法(
setFamily、setFirstName)的返回值类型是void,不能带return语句,正确写法应为直接赋值(比如this.familyName = familyName;) - 创建对象后的
child.setFamilyName("Smith");应为child.setFamily("Smith");,父类定义的方法名是setFamily
接下来针对你的两个问题逐一说明:
1. 多线程环境下创建子类对象是否线程安全?
如果每个线程都是独立创建ChildClass实例(即每个线程执行new ChildClass(),且不会把创建好的对象引用传递给其他线程),那对象创建过程本身是线程安全的——每个线程都会拥有自己独立的对象实例,成员变量(父类的familyName、子类的firstName)都是线程私有,不会产生竞争。
但如果多个线程共享同一个ChildClass对象引用(比如把创建好的child对象发布到多个线程可见的地方),那后续对该对象的操作就不再是线程安全的,这和对象创建过程无关,而是后续读写操作的问题。
2. 父类的setFamily方法是否线程安全?
当前实现下,setFamily方法完全不具备线程安全性,原因如下:
- 成员变量
familyName没有用volatile修饰,无法保证多线程间的可见性——一个线程修改后,其他线程可能无法立即看到最新值 - 方法没有加
synchronized同步锁,也没有使用其他并发工具类,多线程同时调用同一个对象的setFamily方法时,会出现竞态条件:比如线程A和线程B同时赋值,最终可能只保留其中一个线程的赋值结果,或者出现中间状态的读取错误
同理,子类的setFirstName方法也存在同样的线程安全问题。
如果要让这些Setter方法线程安全,可以通过以下方式改造:
- 给Setter方法加上
synchronized修饰,同时Getter方法也建议同步,保证读写操作的原子性和可见性 - 用
volatile修饰成员变量(仅适用于单一赋值操作的场景,复杂操作仍需同步) - 将成员变量定义为
AtomicReference<String>,利用原子类保障操作的线程安全
内容的提问来源于stack exchange,提问作者cappy39
相关产品推荐
相关产品推荐

