2

我正在编写一个静态实用程序方法。我知道方法 isEmpty() , isNew() 是线程安全的。在 getTotal(...) 方法中,我使用 StringBuilder 作为参数 alomg 与 String 和 int.StringBuilder 是可变的。getTotal() 是线程安全的。如果是这样,请解释为什么即使 StringBuilder 是 mutable 也是如此。但我不确定 getCharge() 是否是线程安全的,因为它调用了 getTotal() 方法。有人可以判断它是否是线程安全的

public class NewStringUtils {

    public static boolean  isEmpty(String s){
        return (s == null || s.trim().length()==0);
    }

    public static boolean isNew(String code){
        return( "1009".equals(code) || "1008".equals(code) );
    }
    //StringBuilder is  mutable  -- is the below method threadsafe 
    public static int getTotal(StringBuilder sb,String oldCode ,int a, int b){
        //Is it Threadsafe or not .If so  just bcz every thread invoking this method will have its own copy and other threads can't see its value ?? 
        int k =0;
        if("1011".equals(oldCode) && "1021".equals(sb.toString()) {
            k = a+b;
        }
        return k;
    }
    // is the below method threadsafe 
    public static  int getCharge(String code,String oldCode,int charge1,int charge2){
        int total =0;
        StringBuilder sb = new StringBuilder("1021");
        if(!NewStringUtils.isEmpty(code)){

            if(NewStringUtils.isNew(code)){
                //here invoking a static method which has StringBuilder(Mutable) as a         parameter
                total  = NewStringUtils.getTotal(sb,oldCode,charge1,charge2);
            }
        }

        return total;
     }
}
4

4 回答 4

7

这是。您没有使用任何非方法范围的字段/变量,并且方法的所有参数都是不可变的,因此它是线程安全的。

不使用任何非方法范围变量的方法中唯一的线程安全风险是参数是否可变,因此可以被另一个线程修改。由于原语String是不可变的,所以你很好。

编辑:发表评论:

怎么样:如果一个方法(静态或其他)只使用方法范围的变量,只有不可变的参数并且只调用其他线程安全的方法,那么它必须是线程安全的

于 2013-03-28T16:31:30.407 回答
2

所有变量都是局部变量,线程之间没有共享变量(静态变量,因为它是静态方法),传递的引用要么是原语,要么是不可变类的实例。因此,它是线程安全的。

于 2013-03-28T16:32:39.533 回答
2

您的静态方法在调用之间没有任何状态。通过参数传递的所有状态......所以它的线程安全。

于 2013-03-28T16:32:08.667 回答
0

是的。ints是按值传递的。并且Strings是方法的参数。您没有使用方法外部的任何字段。

编辑

如果要使用StringBuilder而不是,则需要在对象String上进行同步。StringBuilder

public someMethod(StringBuilder sb, ...) {
    synchronized(sb) {

        //this will make sb thread safe.
        //but do this everywhere you access this StringBuilder Object.

    }
}
于 2013-03-28T16:32:27.263 回答