Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么向java添加了非线程安全的类?_Java_Thread Safety - Fatal编程技术网

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

为什么向java添加了非线程安全的类?,java,thread-safety,Java,Thread Safety,我看到很多类被添加到Java中,它们不是线程安全的 就像StringBuffer是线程安全的,StringBuffer是线程安全的,StringBuffer是通过StringBuffer重新编码的 此外,各种集合类都不是线程安全的 线程安全不是一件好事吗 或者我只是个傻瓜,还不明白线程安全的含义?因为线程安全会让事情变得更慢,而不是所有事情都必须是多线程的 考虑阅读本文,了解有关线程安全的基本知识: P>当你对这些线程感到满意时,考虑阅读这本书,它有很大的评论: 固有的线程安全代码会带来性能

我看到很多类被添加到Java中,它们不是线程安全的

就像StringBuffer是线程安全的,StringBuffer是线程安全的,StringBuffer是通过StringBuffer重新编码的

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

线程安全不是一件好事吗


或者我只是个傻瓜,还不明白线程安全的含义?

因为线程安全会让事情变得更慢,而不是所有事情都必须是多线程的

考虑阅读本文,了解有关线程安全的基本知识:

<> P>当你对这些线程感到满意时,考虑阅读这本书,它有很大的评论:


固有的线程安全代码会带来性能开销。如果您不需要并发上下文中的类,但需要高性能,则这些原始类并不理想。

线程安全性不是全有或全无属性。十年前,一些书建议将一个类的所有方法标记为synchronized,以使它们具有线程安全性。这需要一些性能,但它远不能保证整个程序是线程安全的。因此,你有一个可疑的收益成本。这就是为什么Java库中仍然添加了一些非线程安全的类


“使每个方法同步化”策略只能保证一个对象的一致性,并且有可能引入死锁,或者比预想的更弱(想想
wait()
)。

StringBuilder的典型用法如下:

返回新的StringBuilder().append(“this”).append(“that”).toString()


在一个线程中,无需同步任何内容。

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


很难找到一个人为的例子来说明什么时候你会以多线程的方式使用StringBuffer,这是其他方式无法实现的。

@Lokesh Sah:然后在同步块中使用
StringBuilder
,或者在一个块中使用
StringBuffer
@Lokesh Sah:使用
StringBuilder
没有问题多线程程序的线程。如果您想附加来自多个线程的字符串,那么您想要什么语义?应该有一个线程拥有
StringBuilder
一段时间,以便在没有其他线程的情况下附加多个字符串。或者您想要附加字符串的任意交错。在后一种情况下,使用
StringBuffer
@Lokesh Sah:如果您有状态,在本例中是一个可变字符串,并且有多个线程作用于它,那么状态可能会损坏。例如,如果字符串为“run”,线程A可以通过添加“ning”将其更改为“running”,而线程B可能希望通过将第二个字符从“u”更改为“A”将其更改为“ran”。如果两个线程同时尝试此更改,则可能会导致损坏状态,例如本例中的“ranning”。要解决此问题,每个线程都需要锁定可变字符串,查看其当前值,进行必要的更改并释放锁。如果要在多个线程中使用StringBuffer,您仍然可以得到
this
this
等。True,但如果多线程使用StringBuilder,情况可能会变得更糟。看一看append()方法,想想当两个线程同时修改StringBuilder的状态时会发生什么情况。不管是哪种方式,共享一个StringBu*er线程都是一个糟糕的设计,你会得到损坏的文本。但是StringBuilder会更糟糕