【发布时间】:2019-11-18 12:07:27
【问题描述】:
我有这段代码应该输出字符串长度 = 10000,但我不断得到不同的输出,我对它究竟是如何发生的感到困惑?是因为例如线程 1 将追加 95 次,然后另一个线程将中断线程 1,例如:线程 2,然后线程 2 在被 t3 等中断之前将追加最多 98 次。?
【问题讨论】:
-
StringBuilder 不是线程安全的。您不能使用并发线程中的一个。用线程安全的 StringBuffer 替换它,你会得到你期望的结果。
-
StringBuilder不保证线程安全。 stackoverflow.com/a/26860203/2478398。来自文档:“此类设计用于在单个线程正在使用字符串缓冲区的地方用作 StringBuffer 的替代品” -
如果您查看
StringBuilder的源代码,您会发现附加字符很有可能被写入目标数组的同一位置,或者计数获胜不正确。这是因为该类不打算同时使用。因此,您的 100 个线程应每个附加 100 个字符(无中断),但有些会被覆盖,因此最终字符串的长度在 100 到 10000 之间。 -
他们在比赛中,不同步的对象试图聪明地决定每次与它交互时谁获胜,谁失败了。并产生该输出。因为它不是线程安全的。
标签: java multithreading concurrency