Java中可扩展的多线程String对象

时间:2011-07-21 11:42:15

标签: java multithreading string scalability

6 个答案:

答案 0 :(得分:2)

你可能想看看Etherpad的源代码 - 它是一个基于Java的协作文本编辑Web应用程序,所以它必须有某种字符串实现,允许对不同的区域进行并发写入访问字符串,大概不会丢失数据。当然,它是否满足您的性能要求是另一回事......

答案 1 :(得分:1)

字符串本身是线程安全的(因为它是不可变的)并且对于大多数用例而言性能相当高。

String的主要性能问题是在O(n)中突变的字符串长度(由于需要采取完整的副本)。

如果你需要处理很长的字符串,你可能想要使用Rope data structure。 Java中有几种可用的实现:

  • Ropes for Java - 似乎是一个非常好的实现
  • My own implementation - 虽然不太通用,但对于已实施的操作可能更快,因为它的设计开销非常低。

上面的两个Rope实现都符合 CharSequence 接口(String也实现了),因此如果您将应用程序设计为使用CharSequences而不是字符串,那么您可以从字符串开始并切换到如果您决定需要它们,请稍后绳索。

答案 2 :(得分:1)

This talk(免费注册要求)描述了Google Docs等用于多用户编辑的算法类型,并演示了一个简单的实现。在Scala中,但适用于任何语言。

编辑:哎呀,有点晚了!反正可能对某人有用......

答案 3 :(得分:0)

好吧,StringBuffer是线程安全的。您可以将系统基于此。

答案 4 :(得分:0)

在我看来,这将是一个挑战。您需要允许单个用户“锁定”他们正在处理的字符串部分,而其他用户可以锁定并处理其他部分。基本上你所说的是一种数据库形式。

你可以用SQL做到这一点,但你必须发明一个协议。

答案 5 :(得分:0)

主要问题是跟踪变化,因为你不再依赖索引,这让事情变得困难。

所以我现在正在考虑将字符串存储在类似LinkHashMap或ListOrderedMap的内容中。但仍在对正确的数据结构进行更多研究......

编辑:在这个阶段,我将使用ListOrderedMap存储我的字符串,看看它是怎么回事......