设为首页收藏本站

LUPA开源社区

 找回密码
 注册
文章 帖子 博客
LUPA开源社区 首页 业界资讯 技术文摘 查看内容

在ModeShape 4.0的事件使用循环缓冲区

2014-9-17 09:39| 发布者: joejoe0332| 查看: 3915| 评论: 0|原作者: 几点人, 无若, AndyLam, 赵亮-碧海情天, it瞌睡虫|来自: 开源中国社区

摘要: 事件对于ModeShape至关重要。当你的应用保存一些变更到页面,ModeShape就会 产生描述那些变更的事件,并且会发送那些事件到你所有的被注册的应用侦听器中。不管哪些集群产生的这些变化或是集群中你的侦听器在哪一部 ...


4.0 中新的 ChangeBus

  早在去年秋天,我们知道老的 ChangeBus 能够被改进并讨论了一些可能的方法。讨论的这些想法中有一个具备很大潜力:使用一个环形缓冲区


  环形缓冲区其实很简单。概念上,它可以被认为是一个单一的循环缓冲区,在一个单一的游标下,一或多个生产者可以添加条目(以线程安全的方式)到缓冲区中,消费者尾随游标和过程(每个在它们自己的线程内)访问已经保存在缓存中的每个条目。


ChangeSets are added at the cursor, and consumer threads follow behind reading them


  ChangeSets 被添加在游标处,消费者线程跟在后面阅读它们。


  在上图中,数字代表的是缓冲中各项的位置,从1开始,逐次增加。光标的位置是7,读取ChangeSet的每个消费者线程处在各自不同的位置:6、4、3和2 。注意:紧跟在所有消费者线程后面的是垃圾回收线程,它只是对所有消费者线程都读取了的ChangSet引用清空。(我们需要这样的线程,因为环形缓冲通常只有1024或者2048个存储项,而且假设每个环形缓冲区都有具有许多更新的ChangSet的话,就会占用大量内存。环形缓冲的垃圾回收器可以通过JVM对已经处理完成的ChangeSet对象进行回收。)


  下图是另一个环形缓冲图,这张图表示的是在另外添加了7个ChangeSet对象,并且{敏感词}的消费者线程前移后的状态。



  其中光标和所有的消费者线程以及垃圾回收器都已经前移。


  每个消费者位置与其余消费者的位置是毫不相关的,然而,它们的位置很明显与可添加新变更项的光标位置相关。通常,{敏感词}运行的非常快,以致于消费者都紧随在光标之后。当然,也存在其他情况,比如每个ChangeSet中包含的变更数量起伏很大的时候(通常都是这样的)。


  添加的ChangeSet对象越多,光标前移的就会越快,这样就有可能抵达“环形缓冲开始“的地方,此时就会开始重用缓冲区中以前已经使用的缓冲项了。(实际上,缓冲区是一个简单的预先分配了固定大小的Object[],缓冲区的位置可以很容易地被认为是数组的索引。我们只是把它想象为一个环形缓冲区。)



  光标最终将会重用不再需要的缓冲区中的各项。



酷毙

雷人

鲜花

鸡蛋

漂亮
  • 快毕业了,没工作经验,
    找份工作好难啊?
    赶紧去人才芯片公司磨练吧!!

最新评论

关于LUPA|人才芯片工程|人才招聘|LUPA认证|LUPA教育|LUPA开源社区 ( 浙B2-20090187 浙公网安备 33010602006705号   

返回顶部