为什么添加了非线程安全的java类?

时间:2011-03-31 10:15:45

标签: java thread-safety

我看到很多类被添加到Java中,这些类不是线程安全的。

像StringBuffer一样,StringBuilder不是线程安全的,StringBuilder是通过Stringbuffer重新编写的。

此外,各种集合类都不是线程安全的。

线程安全不是好事吗?

或者我只是愚蠢而且还不明白线程安全的含义?

5 个答案:

答案 0 :(得分:11)

因为线程安全性使事情变得更慢,并且并非所有事情都必须是多线程的。

请阅读本文以了解有关线程安全的基础知识:

http://en.wikipedia.org/wiki/Thread_safety

如果您对线程感觉足够舒服,请考虑阅读本书,它有很好的评论:

http://www.amazon.com/Java-Concurrency-Practice-Brian-Goetz/dp/0321349601

答案 1 :(得分:4)

某些类不适合跨多个线程使用。 StringBuffer就是其中之一恕我直言。

很难找到一个人为的例子,说明何时以多线程方式使用StringBuffer,这种方式无法通过其他方式实现。

答案 2 :(得分:3)

线程安全不是全有或全无的属性。十年前,有些书籍建议将类的所有方法标记为已同步,以使其具有线程安全性。这需要一些性能,但远远不能保证您的整个程序是线程安全的。因此,您的成本会带来可疑的收益。也就是说,为什么还有一些类添加到Java库中,这些类不是线程安全的。

“使每个方法同步”策略只能提供关于一个对象的一致性的保证,并且它有可能引入死锁,或者比想象的要弱(想想wait()

答案 3 :(得分:2)

固有的线程安全代码存在性能开销。如果你不需要并发上下文中的类但需要高性能,那么这些原始类并不理想。

答案 4 :(得分:2)

StringBuilder的典型用法如下:

return new StringBuilder().append("this").append("that").toString()

所有在一个线程中,不需要同步任何东西。