【问题标题】:String class Performance Issue字符串类性能问题
【发布时间】:2017-04-11 05:58:39
【问题描述】:

String 是不可变的,Java 中的每个不可变对象都是线程安全的,这意味着 String 也是线程安全的。字符串不能同时被两个线程使用。

StringBuffer 是可变的,但 StringBuffer 中的每个方法都是同步的,即 StringBuffer 是线程安全的。所以性能很慢

那么 My Query is String 有性能问题吗?

【问题讨论】:

  • 您是否询问与连接明确相关的性能问题?
  • "字符串不能被两个线程同时使用。"嗯,是的,它可以,正是因为它不可变的。您将“线程安全”误认为“需要锁定”。所以这个问题的前提被打破了——如果不是这样,那就太宽泛了,真的。
  • “字符串不能同时被两个线程使用”——你为什么这么说?你有什么参考吗?
  • 不可变对象始终是线程安全的。正确的?如果是线程安全的,两个线程如何访问资源。
  • "如果线程安全,两个线程如何访问资源。"嗯,通过阅读?你认为什么是停止两个线程同时访问它?

标签: java string performance performance-testing


【解决方案1】:

不可变并不意味着您不能同时在多个线程中使用相同的字符串。这意味着它的内部状态在实例化后无法更改,这与 StringBuffer 相反,例如调用 append 会更改缓冲区的内部状态。

这意味着它在设计上是线程安全的。

StringBuffer 的性能较低(与 StringBuilder 的性能相反),因为它需要在对其内部状态进行每次操作之前锁定对象。

【讨论】:

    【解决方案2】:

    这似乎不是一个真正的编程问题,而只是你的逻辑不好。

    对于StringBuffer

    • StringBuffer 已同步
    • 因为它的方法是同步的,所以它的方法不会在两个线程中同时运行
    • 因为它的方法不会同时在两个线程中运行,所以它是线程安全的
    • 由于方法是同步的,因此与非同步方法相比,性能较差。

    但是,上述内容并不意味着反之亦然:

    • 因为它是线程安全的,所以不会在两个线程中同时运行
    • 因为它是线程安全的,所以它的性能很差(与非线程安全的对应物相比)

    同步/锁定只是实现线程安全的众多方法之一。

    【讨论】:

      【解决方案3】:

      不存在 String 没有性能问题,因为 String 是不可变的,每次一个进程都可以使用它并且本质上是线程安全的,没有人可以更改它。

      虽然StringBuffer 是可变的,所以多个进程使用单个StringBuffer 对象,但有同步成本。这就是StringBuffer 的性能缓慢的原因。

      流程

      一个进程有一个独立的执行环境。一个进程通常有一套完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间。

      线程

      线程有时被称为轻量级进程。进程和线程都提供了一个执行环境,但是创建一个新线程比创建一个新进程需要更少的资源。

      【讨论】:

      • 线程和进程完全不同 - 恐怕“每次一个进程都可以使用它”没有什么意义。
      • @JonSkeet 那么,线程本身就是一个进程,与其他进程并行。
      猜你喜欢
      • 1970-01-01
      • 2012-08-24
      • 2011-11-09
      • 2013-09-15
      • 2015-05-30
      • 2015-04-27
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      相关资源
      最近更新 更多