温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java String 为何线程安全

发布时间:2026-09-15 05:13:15 来源:亿速云 阅读:107 作者:小樊 栏目:编程语言

在 Java 中,常说 String 是线程安全的,这并不是因为 String 内部用了锁或同步,而是因为它的不可变性(immutability)。

下面从原理上解释:


1. String 是不可变的(核心原因)

在 JDK 中,String 的关键特征:

public final class String
    implements Serializable, Comparable<String>, CharSequence {

    private final char value[]; // JDK 8 及以前
    // JDK 9+ 使用 byte[] value
}

关键点:

  • String 类被 final 修饰:不能被继承
  • 内部存储字符的数组 value 是 private final
  • String 不提供任何修改内部数据的方法(如 setValue、append 等)

一旦创建:

String s = "abc";

s 指向的字符串内容就永远不会改变。


2. 任何“修改”都会生成新对象

例如:

String s1 = "abc";
String s2 = s1.concat("def");

实际发生的是:

  • s1 不变
  • 创建一个新的 String 对象 "abcdef"
  • s2 指向新对象

✅ 原有对象状态从未被修改
✅ 多个线程同时“读取”同一个 String 不会互相影响


3. 不可变 ⇒ 线程安全

线程安全的定义(简化):

多个线程同时访问一个对象,不需要额外同步,也不会出现数据不一致。

因为:

  • 线程只能读取 String
  • 不能修改它
  • 不存在“写—写冲突”或“写—读冲突”

所以:

不可变对象天生就是线程安全的


4. 对比可变字符串

StringBuilder sb = new StringBuilder();
sb.append("a");
sb.append("b");
  • StringBuilder 内部数组可变
  • 多线程同时 append 会出问题(非线程安全)

而:

StringBuffer
  • 功能类似 StringBuilder
  • 方法加了 synchronized
  • 所以线程安全,但性能较低

5. 额外好处(不可变带来的)

除了线程安全,String 不可变还带来:

  1. 字符串常量池(String Pool)
    • 可安全共享
  2. 可以作为 HashMap 的 key
    • hash 值不会变
  3. 类加载安全
    • 类名、路径不会被篡改

总结一句话

Java 的 String 是线程安全的,因为它不可变;任何“修改”都会创建新对象,而不是改变原对象。

如果你愿意,我也可以从 JVM 内存模型 / 字节码 / 源码层面再深入讲一遍。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI
助
手