不变性immutablity设计 回复

楼主,事实上我看了帖子后还是比较混乱,不明白immutablity是怎么解决并发问题的,请楼主指教。

我看了帖子后大概理解是,值对象类似于栈上的值数据,只有自己的线程可以访问和修改,不同线程拥有的实际上是不同的实例,那么自然不存在争用问题,是“线程安全的”,不知道我的理解对不对啊。 可是,这样也失去了并发控制的意义。

前面那位同学也说了,先读后写还是需要串行化(姑且不说是用锁控制还是队列控制),那用不用不可变对象有什么意义,究竟给并发效率提高带来了什么好处?

另一点不明白的是,值对象的值,比如lastedUpdateTime是从数据库取的话,那么一个会话更新这个值后,比如s1_A,那么l_A必然要影响到其他会话(s2)的这个值(否则lastedUpdateTime便一直是旧数据),那么必然会和s2_A冲突。

不變性不代表可以省略所有的並發控制,而是盡可能的減少鎖的使用。倘若每個線程讀寫的值都不會影響到其他線程,那這些線程便可以並行處理。當然,為了最終資料儲存的完整性,當資料寫回唯一儲存地時,仍然需要用鎖來處理,例如你提到的寫回數據庫。

不可变对象比如String Integer等一旦创建,不再改变,不可变类可以降低代码中需要的同步数量。

不变性好处:
1)不变对象缺省是线程安全的,能够无需同步锁在并发环境中共享。

2)不变对象简化了开发,因为无需同步或锁机制就可以在多线程中方便共享。

3) 不可变对象由于不使用同步锁,提升了性能。

4)不可变对象能够重用,你能缓存不可变对象然后重用,比如像 String 和 Integers 。节省内存。

参考:How to create Immutable Class and Object in Java