【问题标题】:What are immutable objects?什么是不可变对象?
【发布时间】:2010-01-19 17:46:31
【问题描述】:

线程安全和不可变对象有什么关系?在多个线程之间共享单个资源是否更容易?如果不可变对象是无状态的,它们是否可以在 J2EE 容器之类的容器中池化?

谢谢

【问题讨论】:

    标签: multithreading immutability


    【解决方案1】:

    不可变对象是无法更改的对象。如果无法更改对象,则无需担心竞争线程会在执行线程“背后”更改对象状态,因此不可变对象不需要通过同步或其他技术进行保护。

    【讨论】:

    • 如果对象是无状态的,谈论不变性也是没有意义的,因为没有状态可以改变。因此,将对象汇集在容器中是安全的。
    • 要考虑的一点是,如果您确实尝试通过重新分配指向该对象的变量来更改不可变对象(例如字符串),那么其他线程将看不到该更改。因此,对不可变对象的“更改”不能跨线程共享。
    • 如果您尝试通过重新分配引用该对象的变量来“更改”任何对象,那么您不知道自己在做什么。
    【解决方案2】:

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

    不可变对象在创建后不得更改。所以:是的,它们是某种无状态的。

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

    【讨论】:

    • 通常无状态对象没有状态。不可变对象不能转换到与其创建时不同的状态,因此它们只有一种状态。
    【解决方案3】:

    不可变对象:不改变其内部状态的对象。

    与线程安全的关系:如果一个对象不能被改变,那么跨线程使用它是安全的,即不需要锁之类的东西来确保跨线程的一致性

    【讨论】:

      猜你喜欢
      • 2012-09-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-02
      • 1970-01-01
      • 2012-01-12
      • 2019-03-26
      • 2012-12-04
      相关资源
      最近更新 更多