是以下静态实用程序方法Threadsafe

时间:2013-03-28 16:29:53

标签: java multithreading

我正在编写一个静态实用程序方法。我知道方法isEmpty(),isNew()是线程安全的...在getTotal(...)方法中我使用StringBuilder作为参数alomg与String和int.StringBuilder是可变的。是getTotal()threadsafe.If解释为什么即使StringBuilder是可变的。   但是我不确定getCharge()是否是线程安全的bcz它调用方法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 个答案:

答案 0 :(得分:7)

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

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

编辑:发表评论:

  

如何:如果方法(静态或其他方式)仅使用   方法范围的变量,只有不可变参数   调用其他线程安全的方法然后它必须是线程安全的

答案 1 :(得分:2)

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

答案 2 :(得分:2)

所有变量都是局部变量,并且线程之间没有共享变量(静态变量,因为它是静态方法),并且传递的引用是基元或不可变类的insance。因此,它是线程安全的。

答案 3 :(得分: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.

    }
}