Java 字符串类性能问题

Java 字符串类性能问题,java,string,performance,performance-testing,Java,String,Performance,Performance Testing,字符串是不可变的,Java中的每个不可变对象都是线程安全的,这意味着字符串也是线程安全的。字符串不能由两个线程同时使用 StringBuffer是可变的,但StringBuffer中的每个方法都是同步的,即StringBuffer是线程安全的。所以性能很慢 那么我的查询是字符串有任何性能问题吗?不可变并不意味着不能在多个线程中同时使用同一字符串。这意味着它的内部状态在实例化后不能更改,与StringBuffer相反,例如调用append更改缓冲区的内部状态 这意味着它在设计上是线程安全的 Str

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

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


那么我的查询是字符串有任何性能问题吗?

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

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


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

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

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


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

否字符串没有性能问题,因为字符串是不可变的,每次一个进程都可以使用它,而且本质上线程安全,没有人可以更改它

StringBuffer
是可变的,因此多个进程使用单个
StringBuffer
对象来进行同步。这就是
StringBuffer
性能缓慢的原因

过程

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

线程


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

不,字符串没有性能问题,因为字符串是不可变的,每次一个进程都可以使用它,而且本质上线程安全,没有人可以更改它

StringBuffer
是可变的,因此多个进程使用单个
StringBuffer
对象来进行同步。这就是
StringBuffer
性能缓慢的原因

过程

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

线程


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

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

对于
StringBuffer

  • StringBuffer已同步
  • 因为它的方法是同步的,所以它的方法不会在两个线程中同时运行
  • 因为它的方法不会在两个线程中同时运行,所以它是线程安全的
  • 因为方法是同步的,所以性能比不同步的方法差
然而,上述情况并不意味着反之亦然,如:

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

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

这似乎不是一个真正的编程问题,但你的逻辑很糟糕

对于
StringBuffer

  • StringBuffer已同步
  • 因为它的方法是同步的,所以它的方法不会在两个线程中同时运行
  • 因为它的方法不会在两个线程中同时运行,所以它是线程安全的
  • 因为方法是同步的,所以性能比不同步的方法差
然而,上述情况并不意味着反之亦然,如:

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

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

您是否询问与连接明确相关的性能问题?“字符串不能由两个线程同时使用。”嗯,是的,它可以,正是因为它是不可变的。您将“线程安全”误认为“需要锁定”。所以这个问题的前提被打破了——如果不是的话,它就太宽泛了,真的。“字符串不能被两个线程同时使用”——你为什么这么说?你有任何引用吗?不可变对象总是线程安全的。对吗?如果是线程安全的,两个线程如何访问一个资源。“如果是线程安全的,两个线程如何访问一个资源。”嗯,通过读取它?你认为是什么阻止了两个线程同时访问它?你是在问与连接显式相关的性能问题吗?“字符串不能被两个线程同时使用。”嗯,是的,它可以,正是因为它是不可变的。您将“线程安全”误认为“需要锁定”。所以这个问题的前提被打破了——如果不是的话,它就太宽泛了,真的。“字符串不能被两个线程同时使用”——你为什么这么说?你有任何引用吗?不可变对象总是线程安全的。对吗?如果是线程安全的,两个线程如何访问一个资源。“