码迷,mamicode.com
首页 > 其他好文 > 详细

技巧两则及所思

时间:2015-11-19 22:17:09      阅读:223      评论:0      收藏:0      [点我收藏+]

标签:

记工作中遇到的两个小问题,每个问题又有两种解法,以及引发的对架构师或者系统设计者的一些感想。权当胡言乱语,说给自己。

记录一。需要给一些对象,每个对象分配一个ID值,作为该对象的引用。而且ID值在系统掉电启动后值不变。

方案一。创建一个文件,为对象分配ID时,到文件中查询,即以该对象的名称作为key,查询是否有对应的ID,如果有,直接返回ID。如果没有,则由一个全局计数器递增,为该对象分配一个ID值。然后把递增后的全局计数器和刚分配的对象名和ID写回文件。

方案二。回望方案一,如果对象有一个名称可以作为key和ID对应,我们为什么不直接使用对象名称作为ID?唯一的合理解释只能是,ID只能为数字。实际上我们的系统中没有这个限制。那么方案一是否类似于脱裤子放屁?

记录二。系统中有一些对象需要动态创建和销毁,同时这些对象有可能被其他多个线程访问,如何确保对象访问的时候不被其他线程删除?这个问题也可简单描述为,如何在多线程环境下如何删除对象。

方案一。首先为每个对象分配一个锁,这个锁的生命周期要长于对象的,也就是说,在销毁对象的时候,对应的锁一定是有效的。然后在对象内定义一个计数,配合这把锁,我们能为对象做引用计数。在该对象被访问的时候,引用计数加一,访问结束时,计数减一。多个线程都可以进行访问操作。在对象销毁前,必须检查引用计数的值是否为0,只有为0才能销毁,否则将该对象标记为无效,并缓存起来,由专门创建的后台任务定时检测计数尝试销毁。

方案二。视销毁对象、创建对象、读对象、写对象为平等的操作,都叫做“访问对象”,不使用引用计数,只使用上面提到的那把锁,令四类“访问”操作互斥。

对比。方案一的效率高,读写操作可以并行,只需各自计数加一,但计数操作和回收机制略显复杂。方案二的效率较低,读写操作都只能串行,但没有引用计数和垃圾回收机制,简单易懂。在多数没有效率要求的多任务系统中,应该优先考虑方案二。

到了说些闲话的时候了。架构师的价值在哪里?就在于在项目初期,能够选择较简单直白的方案,使系统傻瓜稳定。如上面的方案二,让系统二下去吧!

技术分享

技巧两则及所思

标签:

原文地址:http://www.cnblogs.com/mjohh/p/4979005.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!