2

メソッド isEmpty() 、 isNew() はスレッドセーフであることを知っています.. getTotal(...) メソッドでは、StringBuilder を String と一緒にパラメータとして使用しています。int.StringBuilder は変更可能です。getTotal() はスレッドセーフですか。しかし、getCharge() がメソッド getTotal() を呼び出している bcz スレッドセーフであるかどうかはわかりません。スレッドセーフかどうかを誰かに教えてもらえますか

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 に答える