Java中的无状态对象是什么?

2022-08-31 12:19:42

目前我正在阅读“实践中的Java并发”,其中包含以下句子:

由于访问无状态对象的线程的操作不会影响其他线程上操作的正确性,因此无状态对象是线程安全的。

那么,什么是无状态对象呢?


答案 1

无状态对象是没有实例字段(实例变量)的类的实例。该类可能具有字段,但它们是编译时常量(静态 final)。

一个非常相关的术语是不可变的。不可变对象可能具有状态,但在调用方法时不会更改(方法调用不会为字段分配新值)。这些对象也是线程安全的。


答案 2

如果对象没有任何实例字段,则它是无状态的。此外,如果它有一些字段,它可以是无状态的,但它们的值是已知的并且不会改变。

这是一个无状态对象:

class Stateless {
    void test() {
        System.out.println("Test!");
    }
}

这也是一个无状态对象:

class Stateless {
    //No static modifier because we're talking about the object itself
    final String TEST = "Test!";

    void test() {
        System.out.println(TEST);
    }
}

此对象具有状态,因此它不是无状态的。但是,它的状态只设置了一次,以后也不会更改,这种类型的对象称为不可变的

class Immutable {
    final String testString;

    Immutable(String testString) {
        this.testString = testString;
    }

    void test() {
        System.out.println(testString);
    }
}