我知道StringBuffer类是同步的(或线程安全的)而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声明。
任何人都可以解释一下吗?
答案 0 :(得分:2)
synchronized
关键字未显示在生成的JavaDoc中,但如果您打开StringBuffer
的源代码,您将看到每个可以更改实例状态的公共方法实际上签名中包含synchronized
个关键字,例如
public synchronized StringBuffer append(StringBuffer sb) {
toStringCache = null;
super.append(sb);
return this;
}
正如评论中提到的那些静态不直接与线程安全性有关。如果您的意思是这些方法没有使用synchronized
关键字声明,那么这应该回答您的问题。
答案 1 :(得分:2)
"线程安全"是一个很滑的想法。
当有人说像StringBuffer这样的类是"线程安全"它们通常意味着当多个线程访问类时,该类的实例不会以奇怪的,意外的方式运行。例如,如果线程A试图附加"黄色"在线程B附加"绿色"的同时到StringBuffer,最终值可能是" yellowgreen"或者它可能是" greenyellow",但它不会成为" yegrelleown"。不会抛出IllegalStateException,它不会使JVM崩溃。
这些保证使类线程的每个实例安全,但是他们不会使程序线程安全。如果你的程序有一些尝试同时读取StringBuffer的线程C,那么它可能会获得上面两个值中的任何一个,或者它可能只是"黄色"或者只是"绿色& #34;,甚至是空字符串。如果线程C看到字符串中的两个颜色名称很重要,那么您将需要额外的同步来保证它以这种方式发生。
完全由"线程安全"构建程序类不会自动使整个程序"线程安全。"
正如其他答案已经告诉过你的那样,StringBuffer类通过创建所有方法synchronized
来实现线程安全,但这不是实现线程安全的唯一方法,在某些情况下,这可能是不是足够来实现它。如果您想知道什么是线程安全的,什么不是,那么阅读文档非常重要。
此外,当您阅读它时,请注意该课程的使用方式。如果有人将一个类广告为"线程安全"在某些特定的用例中,这并不意味着它将是“线程安全的”#34;在其他用例中