有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何使方法线程安全

假设我有以下方法

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) 个答案

  1. # 1 楼答案

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

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

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