当他们说 StringBuffer class 是同步的时,这到底是什么意思? class 的所有方法都声明为同步的吗?

What exactly does it mean when they say that StringBuffer class is synchronized? Are all methods of that class declared synchronized?

我知道 StringBuffer class 是同步的(或线程安全的)而 StringBuilder 不是。这是否意味着 StringBuffer 中的所有方法(例如 append)都使用关键字 synchronized 声明?

我检查了 hava API: http://docs.oracle.com/javase/7/docs/api/java/lang/StringBuffer.html

根据 API,public StringBuffer append(String str) 等方法未使用关键字 synchronized 声明。

谁能解释一下?

生成的 JavaDoc 中没有出现 synchronized 关键字,但是如果你打开 StringBuffer 的源代码,你会看到每个 public 方法都可以更改实例的状态实际上在其签名中有 synchronized 关键字,例如

public synchronized StringBuffer append(StringBuffer sb) {
    toStringCache = null;
    super.append(sb);
    return this;
}

正如评论中提到的其他人所说,静态与线程安全没有直接关系。如果你的意思是这些方法没有用 synchronized 关键字声明,那么这应该回答你的问题。

"Thread safety" 是个狡猾的想法。

当有人说 class 例如 StringBuffer 是 "thread safe" 他们通常的意思是 class 的一个实例在被不止一个线程。例如,如果线程 A 试图在线程 B 追加 "green" 的同时将 "yellow" 追加到 StringBuffer,则最终值可能是 "yellowgreen" 也可能是 "greenyellow" ,但不会是 "yegrelleown"。不会抛出 IllegalStateException,也不会导致 JVM 崩溃。

这些保证使 class 线程的每个 实例 安全,但它们不会使您的 程序 线程安全的。如果你的程序有一些线程 C 试图同时读取 StringBuffer,那么它可能会得到上面两个值中的任何一个,或者它可能只得到 "yellow",或者只是 "green",甚至空字符串。如果线程 C 在字符串中看到两个颜色名称很重要,那么您将需要额外的同步来保证它以这种方式发生。

完全使用 "thread-safe" classes 构建程序不会自动生成整个程序 "thread safe."

正如其他答案已经告诉你的那样,StringBuffer class 通过使它的所有方法 synchronized 实现线程安全,但这并不是实现线程安全的唯一方法,并且在某些情况下,这可能 不足以 实现它。如果您想知道什么是线程安全的,什么不是,阅读文档很重要。

此外,当您阅读它时,请注意 class 是如何使用的。如果有人在某些特定用例中将 class 广告为 "thread safe",这并不意味着它在其他用例中会是 "thread safe"