我设计聚合对象并使用观察者模式时,碰到这么一个问题,类A聚合类B,而且1对多关系,我在类A中有方法AddNew(B),添加B到链表里,有方法DelB(B),把B重链表中删除,使用时其他方法遍历链表查找一个B实例; 但是在多线程中,我可能在一个线程遍历链表的同时,另一个线程DelB(B),删除了一个B,从而遍历报索引例外. 不知道是设计问题,还是怎么解决呢?
------解决方案--------------------------------------------------------
多线程是需要对象进行同步和互斥的。一个线程操作时,进入管道,其它线程不能操作。
这个从具体层面来讲并不是设计问题,而是具体编程的问题。
你可以看看实时应用系统设计的书,里面有很多关于这样的内容。
------解决方案--------------------------------------------------------
1,这本身是一个矛盾,如果按你原有设计,必须对add,del方法中进行同步处理。比如临界区,信号量等
但是这会牺牲效率。对于较少的增,删除动作的话,这是一个比较好的方法。
2.如果你的增删除比较频繁,那么以上方法就不很好了。你应该用状态来表示是否删除。
多线中只需要控制状态量就可以了,大大提高效率,当然也需要做好同步。