除非我有意识地创建多个线程,否则不使用同步集合(或其他任何东西)是一个好的(安全)经验法则吗?
不它不是。
在某些情况下会涉及多个线程,即使您没有有意识地创建它们。例如,任何使用 Swing 或 Servlets 的应用程序都有可能在不同线程上的应用程序代码之间进行交互。(你甚至可以争辩说,如果你使用标准的线程池实现,你并没有显式地创建线程。)
此外,使用同步集合并不一定能保证线程安全。
但是从某种意义上说,您是正确的,当不可能有多个线程使用数据结构时使用同步数据结构是(有点)浪费。但是没有什么地方比过去互斥量昂贵的时候更浪费了。
换句话说,我收到消息“尽可能使用新的 StringBuilder。”,我想知道的是,我如何确定它是可能的?
通过理解你的代码。StringBuilder
其他线程可以看到吗?如果没有,那么使用它是安全的。否则,共享的线程StringBuilder
需要同步。一种方法可能是使用 a StringBuffer
,但这不一定会给您正确的同步粒度。
这是一个简单的例子:
public String nTimes(String str, int n) {
StringBuilder sb = new StringBuilder();
for (int i = 1; i <= n; i++) sb.append(str);
return sb.toString();
}
在上面,StringBuilder
insb
永远不会被另一个线程看到,所以不需要同步它。