Java:使用同步集合的经验法则?

标签 java collections synchronize

我正在阅读此 Stackoverflow thread关于使用 StringBuilder 与 StringBuffer。

底线似乎是,这两个集合是相同的,只是 StringBuffer 是同步的,是线程安全的,并且与 StringBuilder 相比,性能稍差一些,而 StringBuilder 则不是这些。

有人提出了 ArrayList 和 Vector 之间存在类似的关系。

除非我有意识地创建多个线程,否则不使用同步集合(或其他任何东西)是一个好的(安全)经验法则吗?

换句话说,我收到消息“尽可能使用新的 StringBuilder。”,我想知道的是,我如何确定它是可能的?

只要我不故意创建新线程,使用非同步集合是否安全?

最佳答案

使用不同步的东西,直到您确定需要同步为止。

部分问题例如StringBufferVector 的缺点是它们并不总是以正确的方式同步。对于Vector,您并不总是需要单独同步每个操作;通常,您真正想要的是同步操作 block ...为此,Vector 不一定比 ArrayListCollections.synchronizedList 更好>.

当您知道您正在使用并发和多线程时,请计算出您需要的同步的详细信息,但只需将 StringBuffer 替换为 StringBuilder 只会给出你会产生一种错误的安全感——即使你决定稍后使用并发,这也不一定是正确的并发类型

(如果您当前没有使用线程,那么将 StringBuffer 查找并替换为 StringBuilder 绝对没问题,甚至是推荐。上述参数为相反方向。)

关于Java:使用同步集合的经验法则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11887558/

相关文章:

java - 获取 JPanel 的 PaintComponent 元素以与其中的另一个 JPanel 一起使用

java - 在 Java 中使用 "+,-,|"绘制形状

java - 给定一个 IP 地址列表,你如何找到最小值、最大值?

java - 如何在 Thymeleaf 3.0.5 中从 DB 读取 Thymeleaf 模板?

java - Servlet 作为 JSP Java 配置

java - 在Java中保存集合最有效的方法是什么?

java - 为什么 'add' 方法在 AbstractCollection 中不是抽象的?

java - 如何在eclipse中同步使用TortoiseSVN 1.8导入的项目?

java - Class对象A是在JVM加载A类时创建的,还是我调用A.class时创建的?

java - 如何在 Android/Java 中同步 File 对象