假设我有以下方法
public static String addStringItems(String[] items, boolean forceUpperCase) {
StringBuilder builder = new StringBuilder(items.length);
for (String item : items) {
builder.append(item);
}
return forceUpperCase ? builder.toString().toUpperCase() : builder.toString();
}
现在,如何使其线程安全,将其标记为synchronized
是否足够?或者我应该使用StringBuffer
而不是StringBuilder
?你还有其他建议吗?
您的方法编写得很好,并且尽可能保证线程安全。它不访问共享状态,基本上是一个纯函数。该方法被传递一个数组,该数组本身是一个非线程安全对象,但是在评估该方法自身的线程安全性时,不应考虑该问题。
需要注意的关键是,如果调用方没有处理String[]
的线程安全问题,那么这个方法对此无能为力,即使它试图在中创建一个防御性副本同步的
块。不能保证此方法使用的锁将用于保护所有其他可能修改它的地方的String[]
。这就是为什么String[]
参数的并发一致性基本上是调用方的责任。
同样,不需要使用StringBuffer
,只有在线程之间共享时才有意义。您的StringBuilder
永远不会离开该方法,该方法将在同一线程上完整执行。