百科问答小站 logo
百科问答小站 font logo



为什么不建议一个对象在多处存储引用? 第1页

  

user avatar   Ivony 网友的相关建议: 
      

这个问题简单多了。


不论是Area里面有一个保存Item容器,还是Item上面有一个Area引用,都已经有足够的信息。所以现在的问题是在于,当Item上已经有Area的引用的时候,那么Area是否还有必要保留对Item的引用。


这是个典型的关于冗余的问题。

冗余会带来什么问题?

首先是占用更多的存储空间,但这通常不成为一个问题,尤其是只存储一个引用的时候。

那么另外一个问题就是数据一致性的问题,当冗余数据出现,就可能存在数据的不一致。在这个例子里面,譬如说a : Area保存了b : Item的引用,但是b的Area属性不是a。

这就是数据不一致,这时候我们不知道b到底是属于a还是不属于。或者说通过不同的方式处理数据的时候,例如我们遍历a的时候能找到b,但是找b的容器的时候又找不到a。


为了避免出现一致性的问题,我们通常需要做原子性操作,原子性就是说多个操作要么都成功,要么都失败。例如我们让a添加子元素b和设置b的Area属性为a这两个操作是原子性的,要么都成功要么都失败,就可以避免产生数据不一致的问题。

但遗憾的是,原子性是非常难做到的一件事情,很多时候代价非常大。因为我们要处理非常多的异常情况,例如操作被中断,数据写入时出现故障,并发冲突等等。

当然,大多数时候我们只要把两个操作写在一个方法里面或者其他强约束就足够满足了。更长的生命周期,更重要的数据会有更加严苛的要求。


但是即便做不到绝对的原子性,我们也不一定就会出现数据不一致的情况。而即便出现了数据不一致的情况,也不一定就无法进行修复和补救,例如我们可以强行认定Area属性是正确的数据,据此来修复所有的不一致情况。

所以,这只是一个需要权衡的问题。冗余会带来更好的性能,但是也会带来数据不一致的风险。




  

相关话题

  既然Java反射可以访问和修改私有成员变量,那封装成private还有意义么? 
  将文件编译成某种代码,打印到A4纸上,这种想法是否可行? 
  大龄门外汉如何进入软件开发行业? 
  写代码一遍就成功是怎么一种体验? 
  不适合编程的人是怎样的? 
  相比其他语言,C、C++究竟快在哪里? 
  内存为啥要分堆栈在编程里,要是全部只用堆或者全部只用栈,行不行? 
  Qt 为什么在桌面应用(Windows 平台)中不流行呢? 
  在 C++ 里实现矩阵库的关键点是什么? 
  我经常看到 Java 架构师的说法,但是很少看到 C++ 架构师的说法。有哪些造成该现象的原因? 

前一个讨论
如何看待公众号“远方青木”在公众号上传播关于新型冠状病毒肺炎的谣言?
下一个讨论
C# 秒杀物品,程序如何控制并发?





© 2024-11-24 - tinynew.org. All Rights Reserved.
© 2024-11-24 - tinynew.org. 保留所有权利