MST

星途 面试题库

面试题:Java中不可变类如何保证线程安全性

请简述Java不可变类的特性,以及这些特性是如何确保其在多线程环境下的线程安全性的。举例说明一个简单的不可变类并阐述其线程安全原理。
34.8万 热度难度
编程语言Java

知识考点

AI 面试

面试题答案

一键面试

Java不可变类的特性

  1. 状态不可改变:一旦创建,其内部状态(成员变量)就不能再被修改。所有成员变量通常被声明为final,确保它们在对象初始化后不能被重新赋值。
  2. 对象创建后哈希值不变:由于对象状态不可变,其哈希值在创建后也不会改变,这使得不可变类非常适合作为HashMap的键。
  3. 线程安全:无需额外的同步机制即可在多线程环境下安全使用。

确保多线程环境下线程安全性的方式

  1. 避免共享可变状态:不可变类没有可变的状态,所有线程访问的都是同一个不可变对象,不存在数据竞争问题。因为没有可变数据,就不会出现一个线程修改数据,另一个线程读到不一致数据的情况。
  2. 对象创建时的安全发布:由于对象一旦创建就不可变,在创建过程中就可以确保对象的状态是正确初始化的,并且创建后状态不会改变,所以可以安全地发布给多个线程使用。

简单不可变类示例及线程安全原理

public final class ImmutableClass {
    private final int value;

    public ImmutableClass(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}
  1. 线程安全原理
    • ImmutableClass类被声明为final,防止被继承,避免子类改变其行为。
    • value成员变量被声明为final,一旦初始化就不能再被修改。
    • 没有提供修改value的方法,只有获取valuegetValue方法。因此,多个线程访问ImmutableClass对象时,只能读取value的值,不会出现数据竞争,从而保证了线程安全性。