我知道Matcher
类是线程不安全的。
但是我的方法也不安全吗?我想不是..或者,如果是的话,请你能解释一下......
private static String doSomething(String rawValue) {
return rawValue.replaceAll("&","&").replaceAll("#","#")
.replaceAll("<","<").replaceAll(">",">")
.replaceAll("\\(","(").replaceAll("\\)",")");
}
答案 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
可以被多个线程同时修改。
结论:方法本身在我看来是可以的,因为它不使用任何外部资源/变量/等并处理不可变对象。使用它的程序的线程安全性实际上取决于方法的用法。