Java 字符串替换所有线程不安全

Java 字符串替换所有线程不安全,java,string,replaceall,Java,String,Replaceall,我知道Matcher类是线程不安全的 但是我的方法也是线程不安全的吗?我想不是。。或者请你向我解释一下 private static String doSomething(String rawValue) { return rawValue.replaceAll("&","&amp;").replaceAll("#","&#35;") .replaceAll("<","&lt;").replace

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

但是我的方法也是线程不安全的吗?我想不是。。或者请你向我解释一下

private static String doSomething(String rawValue) {
        return rawValue.replaceAll("&","&amp;").replaceAll("#","&#35;")
                       .replaceAll("<","&lt;").replaceAll(">","&gt;")
                       .replaceAll("\\(","&#40;").replaceAll("\\)","&#41;");
    }
私有静态字符串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,并且处理不变的对象。使用它的程序的线程安全性实际上取决于方法的使用。

要使线程不安全,您需要读取一个由不同线程更改的可变值。所以不是。要使线程不安全,您需要读取一个可变值,该值由不同的线程更改。所以没有。