什么是不可变对象?

6
线程安全和不可变对象之间有什么关系?它是否可以更轻松地在多个线程之间共享单个资源?如果不可变对象是无状态的,它们是否可以像J2EE容器一样在容器中进行池化?
谢谢。
3个回答

10

Immutable objects是指不能被更改的对象。如果一个对象不能被更改,那么就不用担心竞争线程会在执行线程的“背后”更改对象状态,因此immutable objects 不需要通过同步或其他技术进行保护。


1
如果对象是无状态的,谈论不可变性就没有意义,因为没有状态可以改变。因此,在容器中池化对象是安全的。 - Mauricio
需要考虑的一件事是,如果您尝试通过重新分配指向该对象的变量来更改不可变对象(例如字符串),则其他线程将无法看到该更改。因此,不可变对象的“更改”无法在线程之间共享。 - Aaron
如果您尝试通过重新分配引用该对象的变量来“更改”任何对象,那么您就不知道自己在做什么。 - Pete Kirkham

5

线程安全的对象是允许多个线程同时访问的对象。它们的实现通过锁定/同步方法等方式保证它们不会进入无效状态。此外,不应该有数据丢失。

不可变对象在创建后不能被修改。所以:是的,它们某种程度上是无状态的。

由于不可变对象不能被更改,因此不需要锁定 - 对象的读取访问始终是线程安全的(当不修改变量时)。因此,真正的不可变对象总是线程安全的。


1
通常无状态对象没有状态。不可变对象不能从创建时的状态转换到另一个状态,因此它们只有一个状态。 - Pete Kirkham

4

不可变对象:一个对象在创建后其内部状态不会改变。

与线程安全的关系:如果一个对象无法被改变,那么跨线程使用它是安全的,即不需要锁定或类似的方法来确保跨线程的一致性


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接