【问题标题】:Scalable multi threaded String object in JavaJava中可伸缩的多线程字符串对象
【发布时间】:2026-02-17 23:15:01
【问题描述】:

我正在为我计划构建的服务器应用程序做一些研究。 主要功能将是 - 大量用户将能够进行实时编辑。

因此,请研究可扩展字符串的所有选项,它们基本上是某种字符串缓冲区,但能够同时处理大量(数百个?)线程处理大量文本。

与其重新发明*,我希望看到共享的库具有这样的特性 :) 我在 Google 上找不到太多东西。

【问题讨论】:

  • 对于您的文档来说,字符串真的是正确的数据结构吗?它完全是纯文本吗?即使是这样,你如何处理文本中的特定部分?面对同时修改某些文本说“字符 200 到字符 210”不是解决某些字符串的可靠方法。
  • 您也可以考虑一种乐观的方法 - 即 100 个人真的会同时进行编辑。也许吧,但有些 wiki 采用“检测冲突并合并”的方法,发现大多数编辑都没有争议......?
  • 基本上,问题正如 Joachim 所暗示的那样——“字符串”不是正确的物理结构,即使文档在概念上可能被视为字符串。如果一个人正在编辑第 2 页而另一个人正在编辑第 4 页,那么简单的 StringBuffer 不会破解它。正如我在回答中所说,您确实需要某种数据库,然后是顶部的协议来记住各个部分如何组合在一起(并允许剪切/粘贴部分等)。这是一项具有挑战性的任务。
  • "字符串真的是文档的正确数据结构吗?"好吧,我真的不在乎。绳串数据结构看起来不错。它完全是纯文本。 “也就是说,真的会有 100 个人同时进行编辑。”是的,他们可以。虽然也许我可以允许部分并让最大数量的人编辑某个部分。也许我真的不需要多线程。每个部分都可以有自己的可伸缩字符串对象。

标签: java multithreading string scalability


【解决方案1】:

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

【讨论】:

  • 啊,我想要构建的东西非常相似,呵呵。谢谢!
【解决方案2】:

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

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

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

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

【讨论】:

  • 谢谢,现在去研究一下:)
【解决方案3】:

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

编辑:哎呀,有点晚了!无论如何可能对某人有用...

【讨论】:

  • 我从未真正开始使用该应用程序,但仍然在我要写的东西清单上。我会给它一个手表:)
【解决方案4】:

好吧,StringBuffer 是线程安全的。您可以以此为基础构建您的系统。

【讨论】:

  • 首先是的。但它只允许一个线程同时在 iirc 上工作。
  • 不,你错了——StringBuffer允许许多线程同时在上面操作——这就是“线程安全”的定义.请点击链接并阅读那里的javadoc
  • 我已经阅读了 javadoc。线程安全意味着,可以安全地被多个线程使用(如 javadoc 中所引用的)。并不意味着它允许多个线程同时完成工作。除非我在 javadoc 中以某种方式错过了这一点,否则请随时指出:)
  • 多个线程可以修改同一个StringBuffer。他们必须先获得锁。我想如果你做了一个insert(offset, string),但是另一个线程在offset之前插入了一些文本,那么你就不会在正确的位置插入(javadoc不清楚,我没有测试过)。
【解决方案5】:

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

您可能可以使用 SQL 来做到这一点,但您必须发明一种协议。

【讨论】:

    【解决方案6】:

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

    所以我现在正在考虑将字符串存储在 LinkHashMap 或 ListOrderedMap 之类的东西中。但是仍然在正确的数据结构上做更多的研究......

    编辑:在这个阶段,我将使用 ListOrderedMap 来存储我的字符串,看看效果如何......

    【讨论】: