Java 字符串替换所有线程不安全
我知道Java 字符串替换所有线程不安全,java,string,replaceall,Java,String,Replaceall,我知道Matcher类是线程不安全的 但是我的方法也是线程不安全的吗?我想不是。。或者请你向我解释一下 private static String doSomething(String rawValue) { return rawValue.replaceAll("&","&").replaceAll("#","#") .replaceAll("<","<").replace
Matcher
类是线程不安全的
但是我的方法也是线程不安全的吗?我想不是。。或者请你向我解释一下
private static String doSomething(String rawValue) {
return rawValue.replaceAll("&","&").replaceAll("#","#")
.replaceAll("<","<").replaceAll(">",">")
.replaceAll("\\(","(").replaceAll("\\)",")");
}
私有静态字符串doSomething(字符串值){
返回rawValue.replaceAll(“&”、“&;”)。replaceAll(“#”、“#;”)
.replaceAll(“,”)
.replaceAll(“\\”、“&”40;”).replaceAll(“\\”、“&”41;”;
}
您正在通过引用传递一个不可变对象
参数上的replaceAll
方法不会影响参数,它会创建一个新的String
实例
要测试这一点,可以执行以下操作:
String newValue = rawValue.replaceAll(...);
System.out.println(rawvalue); // old value
您正在通过引用传递一个不可变对象 参数上的
replaceAll
方法不会影响参数,它会创建一个新的String
实例
要测试这一点,可以执行以下操作:
String newValue = rawValue.replaceAll(...);
System.out.println(rawvalue); // old value
是的,这个方法是线程安全的;它不会修改任何共享数据
在多个线程中使用同一个
Matcher
实例是不安全的,但是在同一时间在不同的线程中使用不同的Matcher是可以的。即使replaceAll
方法在内部使用Matcher
,每次调用都将是不同的实例,这意味着即使不同的线程同时调用它,也会有不同的实例。是的,此方法是线程安全的;它不会修改任何共享数据
在多个线程中使用同一个
Matcher
实例是不安全的,但是在同一时间在不同的线程中使用不同的Matcher是可以的。即使replaceAll
方法在内部使用Matcher
,每次调用都会有不同的实例,这意味着即使不同的线程同时调用它,也会有不同的实例。Matcher
类不是线程安全的,因为它的对象具有内部状态,如果在多个线程中使用,可以同时修改这些状态
你问题的答案取决于你所说的线程(un)安全的确切含义
第一点-String
类对象在Java中是不可变的,返回子字符串、替换原始字符串中的内容、添加内容等的方法-返回全新的String
第二点-用你的方法考虑这样的代码:
someOldStr = yourClass.doSomething(someOldStr);
if (newStr.contains("A")) {
//do something
} else {
//do something else
}
我会责怪这段代码容易产生数据竞争-someOldStr
可以由多个线程同时修改
结论:方法本身在我看来是可以的,因为它不使用任何外部资源/变量/etc,并且处理不变的对象。使用它的程序的线程安全性实际上取决于方法的使用。
Matcher
类不是线程安全的,因为它的对象具有内部状态,如果在多个线程中使用,可以同时修改这些状态
你问题的答案取决于你所说的线程(un)安全的确切含义
第一点-String
类对象在Java中是不可变的,返回子字符串、替换原始字符串中的内容、添加内容等的方法-返回全新的String
第二点-用你的方法考虑这样的代码:
someOldStr = yourClass.doSomething(someOldStr);
if (newStr.contains("A")) {
//do something
} else {
//do something else
}
我会责怪这段代码容易产生数据竞争-someOldStr
可以由多个线程同时修改
结论:方法本身在我看来是可以的,因为它不使用任何外部资源/变量/etc,并且处理不变的对象。使用它的程序的线程安全性实际上取决于方法的使用。要使线程不安全,您需要读取一个由不同线程更改的可变值。所以不是。要使线程不安全,您需要读取一个可变值,该值由不同的线程更改。所以没有。