不可变数据和锁定

时间:2011-11-01 17:38:09

标签: multithreading language-agnostic locking

是否有任何理由为(不可能的)不可变数据提供锁定机制?

3 个答案:

答案 0 :(得分:5)

通常,没有。使用不可变数据的一个主要优点是可以避免锁定,因为您隐含保证数据是“最新的”,包括您在内的任何人都无法修改它。

答案 1 :(得分:3)

如果该接口的某些实现可能需要锁定,则在某些情况下可能需要具有只读接口来提供AcquireReadLock方法。实现接口的不可变对象不一定要响应AcquireReadLock请求而做任何事情,但它必须至少为该方法提供存根实现;在尝试执行一系列读取之前,该方法的用户应该调用AcquireReadLock,如果某些其他线程在它们之间改变对象,则可能会产生不良结果(请注意,即使使用只读接口也无法对对象进行变更) ,只读接口的存在并不意味着该对象不会通过其他手段进行变异)。此外,即使其他不可变对象不需要锁定,它仍然可能希望有一个“模拟”锁定的选项,以确认该对象的消费者正确获取和释放锁。

答案 2 :(得分:1)

不,如果它确实完全不可变,那就不行了。