我看到很多类被添加到Java中,这些类不是线程安全的。
像StringBuffer一样,StringBuilder不是线程安全的,StringBuilder是通过Stringbuffer重新编写的。
此外,各种集合类都不是线程安全的。
线程安全不是好事吗?
或者我只是愚蠢而且还不明白线程安全的含义?
答案 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()
所有在一个线程中,不需要同步任何东西。