字符串replaceall线程不安全

时间:2014-06-25 12:30:28

标签: java string replaceall

我知道Matcher类是线程不安全的。

但是我的方法也不安全吗?我想不是..或者,如果是的话,请你能解释一下......

private static String doSomething(String rawValue) {
        return rawValue.replaceAll("&","&").replaceAll("#","#")
                       .replaceAll("<","&lt;").replaceAll(">","&gt;")
                       .replaceAll("\\(","&#40;").replaceAll("\\)","&#41;");
    }

3 个答案:

答案 0 :(得分:1)

您通过引用传递了不可变对象。

参数上的replaceAll方法不会影响参数,它会创建一个新的String实例。

要测试此功能,您可以执行以下操作:

String newValue = rawValue.replaceAll(...);
System.out.println(rawvalue); // old value

答案 1 :(得分:1)

是的,这种方法是线程安全的;它不会修改任何共享数据。

在多个线程中使用相同的Matcher实例是不安全的,但可以同时在不同的线程中使用不同的匹配器。即使replaceAll方法在内部使用Matcher,它也会是每个调用的不同实例,这意味着不同的实例即使它被同一个不同的线程调用。

答案 2 :(得分:1)

Matcher类不是线程安全的,因为它的对象具有内部状态,如果在多个线程中使用它,可以同时修改它。

您问题的答案取决于您的意思线程 - (联合国)安全

第一点 - String类对象在Java中是不可变的,返回子字符串的方法,替换原始字符串中的内容,添加内容等 - 返回全新 String

第二点 - 使用您的方法考虑这样的代码:

someOldStr = yourClass.doSomething(someOldStr);
if (newStr.contains("A")) {
    //do something
} else {
    //do something else
}

我会责怪这段代码容易出现数据争用 - someOldStr可以被多个线程同时修改。

结论:方法本身在我看来是可以的,因为它不使用任何外部资源/变量/等并处理不可变对象。使用它的程序的线程安全性实际上取决于方法的用法。