如何使方法线程安全

时间:2014-01-19 11:48:59

标签: java multithreading

假设我有以下方法

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?您还有其他建议吗?

1 个答案:

答案 0 :(得分:8)

您的方法编写得很好,并且尽可能是线程安全的。它不访问共享状态,基本上是纯函数。该方法传递给一个数组,该数组本身就是一个非线程安全的对象,但是在评估方法自身的线程安全性时不应该考虑这个问题。

需要注意的关键是,如果调用者没有处理String[]的线程安全问题,那么这个方法无法做到这一点,即使它试图制作synchronized块内的防御性副本。无法保证此方法使用的锁将用于保护可能被修改的所有其他位置的String[]。这就是为什么String[]参数的并发一致性基本上是调用者的责任。

出于同样的原因,不需要使用StringBuffer,这只有在线程之间共享时才有意义。您的StringBuilder永远不会离开该方法,并且该方法在整个相同的线程上执行。