在网络项目中,我有多个对象,每个对象都有一个消息队列(链表)。每个对象也有一些客户端,每个客户端都有一个指向队列中节点的指针。当客户端收到其指针指向的消息时,其指针将转到队列中的下一条消息。现在,当所有客户端都收到消息时,我希望释放该消息,这样就不会占用内存。我这样做是通过让一个单独的线程遍历对象并删除不需要的消息,充当GC,但是有更好的方法吗?
感谢。
答案 0 :(得分:3)
您可以使用引用计数来处理此问题。假设所有指向队列元素的指针都来自外部(并且从不在队列元素之间),您可以在队列单元格中存储指向它的指针数。无论何时添加新指针,都会增加此引用计数,并且每当使用单元格完成程序的一部分时,它会删除引用计数,当它达到零时释放它。这样,只要有一个指向单元格的未完成指针,它就不会被释放,并且一旦对队列单元的最后一次引用被破坏,它就会被回收。您不需要单独的线程来执行此操作。
答案 1 :(得分:1)
消息中包含订阅者列表。
每次订阅者打开邮件时,订阅者数量减少一个。所以,你有一个线程在寻找订户数= 0的消息。
这是一个坏主意。
您应该建立一个对象删除队列。订户每次打开消息时都会检查订户计数。如果为零,则消息订户自己将消息提交到删除队列。现在GC线程只需要监视删除队列。
为什么要打扰一个柜台呢。消息订阅者列表是令牌的链接列表。每个订户与列表中的一个令牌相关联。令牌告诉订户有消息。
如果消息队列在网络上运行,则每个订户生成一个令牌,并将令牌链接到循环列表中。对于列表中的每个令牌,生成相应的令牌以发送给订户。当订阅者请求消息检索时,它将其身份验证令牌提交给消息队列管理器。消息队列管理授权令牌并允许订阅者访问消息,然后从列表中取消链接令牌。
无论是网络消息队列还是本地系统队列,当最后一个令牌被取消链接时(它是一个循环列表 - 你会知道它是最后一个令牌),该消息将被提交给删除队列。