Java 字符串类性能问题
字符串是不可变的,Java中的每个不可变对象都是线程安全的,这意味着字符串也是线程安全的。字符串不能由两个线程同时使用 StringBuffer是可变的,但StringBuffer中的每个方法都是同步的,即StringBuffer是线程安全的。所以性能很慢Java 字符串类性能问题,java,string,performance,performance-testing,Java,String,Performance,Performance Testing,字符串是不可变的,Java中的每个不可变对象都是线程安全的,这意味着字符串也是线程安全的。字符串不能由两个线程同时使用 StringBuffer是可变的,但StringBuffer中的每个方法都是同步的,即StringBuffer是线程安全的。所以性能很慢 那么我的查询是字符串有任何性能问题吗?不可变并不意味着不能在多个线程中同时使用同一字符串。这意味着它的内部状态在实例化后不能更改,与StringBuffer相反,例如调用append更改缓冲区的内部状态 这意味着它在设计上是线程安全的 Str
那么我的查询是字符串有任何性能问题吗?不可变并不意味着不能在多个线程中同时使用同一字符串。这意味着它的内部状态在实例化后不能更改,与StringBuffer相反,例如调用
append
更改缓冲区的内部状态
这意味着它在设计上是线程安全的
StringBuffer的性能较低(与StringBuilder的性能相反),因为它要求在对对象的内部状态进行每次操作之前锁定对象。不可变并不意味着不能在多个线程中同时使用同一字符串。这意味着它的内部状态在实例化后不能更改,与StringBuffer相反,例如调用
append
更改缓冲区的内部状态
这意味着它在设计上是线程安全的
StringBuffer的性能较低(与StringBuilder的性能相反),因为它要求在对对象的内部状态进行每次操作之前锁定对象。否字符串没有性能问题,因为字符串是不可变的,每次一个进程都可以使用它,而且本质上线程安全,没有人可以更改它 而
StringBuffer
是可变的,因此多个进程使用单个StringBuffer
对象来进行同步。这就是StringBuffer
性能缓慢的原因
过程
流程具有自包含的执行环境。一个进程通常有一组完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间
线程
线程有时被称为轻量级进程。进程和线程都提供了一个执行环境,但创建一个新线程所需的资源比创建一个新进程所需的资源要少。不,字符串没有性能问题,因为字符串是不可变的,每次一个进程都可以使用它,而且本质上线程安全,没有人可以更改它 而
StringBuffer
是可变的,因此多个进程使用单个StringBuffer
对象来进行同步。这就是StringBuffer
性能缓慢的原因
过程
流程具有自包含的执行环境。一个进程通常有一组完整的、私有的基本运行时资源;特别是,每个进程都有自己的内存空间
线程
线程有时被称为轻量级进程。进程和线程都提供了一个执行环境,但是创建一个新线程所需的资源比创建一个新进程所需的资源要少。这似乎不是一个真正的编程问题,只是您的逻辑不好 对于
StringBuffer
- StringBuffer已同步
- 因为它的方法是同步的,所以它的方法不会在两个线程中同时运行
- 因为它的方法不会在两个线程中同时运行,所以它是线程安全的
- 因为方法是同步的,所以性能比不同步的方法差
- 因为它是线程安全的,所以不会在两个线程中同时运行
- 因为它是线程安全的,所以它的性能很差(与非线程安全的对应项相比)
同步/锁定只是实现线程安全的众多方法之一 这似乎不是一个真正的编程问题,但你的逻辑很糟糕 对于
StringBuffer
- StringBuffer已同步
- 因为它的方法是同步的,所以它的方法不会在两个线程中同时运行
- 因为它的方法不会在两个线程中同时运行,所以它是线程安全的
- 因为方法是同步的,所以性能比不同步的方法差
- 因为它是线程安全的,所以不会在两个线程中同时运行
- 因为它是线程安全的,所以它的性能很差(与非线程安全的对应项相比)
同步/锁定只是实现线程安全的众多方法之一 您是否询问与连接明确相关的性能问题?“字符串不能由两个线程同时使用。”嗯,是的,它可以,正是因为它是不可变的。您将“线程安全”误认为“需要锁定”。所以这个问题的前提被打破了——如果不是的话,它就太宽泛了,真的。“字符串不能被两个线程同时使用”——你为什么这么说?你有任何引用吗?不可变对象总是线程安全的。对吗?如果是线程安全的,两个线程如何访问一个资源。“如果是线程安全的,两个线程如何访问一个资源。”嗯,通过读取它?你认为是什么阻止了两个线程同时访问它?你是在问与连接显式相关的性能问题吗?“字符串不能被两个线程同时使用。”嗯,是的,它可以,正是因为它是不可变的。您将“线程安全”误认为“需要锁定”。所以这个问题的前提被打破了——如果不是的话,它就太宽泛了,真的。“字符串不能被两个线程同时使用”——你为什么这么说?你有任何引用吗?不可变对象总是线程安全的。对吗?如果是线程安全的,两个线程如何访问一个资源。“