1

Spring は初めてです。シングルトンである Spring Bean の countService があります。

public class CountService {
    private int doCount() {
        String commentsText = null;
        List tranIds = new ArrayList();
        int count = 0;
        // ---business logic----

        return count;
    }
}

メソッド変数 commentsText,tranIds はスレッドセーフですか?よろしくお願いします

4

2 に答える 2

2

Spring であろうとなかろうと、Javaローカル変数は、それらのオブジェクトを手動で他のスレッドと共有しない限り、スレッドセーフです。たとえば、「ビジネス ロジック」コードが新しいスレッドを作成し、ローカル変数をこれらのスレッドに渡す場合、ローカル変数はスレッド セーフではありません。それ以外は、メソッドを実行している実行中の各スレッドは、他のすべてのローカル変数とは別の独自のローカル変数を取得します。

于 2012-06-30T10:01:53.290 に答える
2

スレッド間で共有される状態がまったくない場合、コードはスレッドセーフです。

したがって、ローカル変数しかない場合、メソッドはスレッドセーフです。もちろん、これらのローカル変数が実際に共有オブジェクトへの参照であり、これらの共有オブジェクトがスレッド セーフでない場合、問題が発生します。

ただし、メソッドが使用するすべてのオブジェクトがメソッド自体によって作成されている場合は、何も共有されず、安全です。

スレッド セーフ コードの例:

 public int foo(String a, String b) {
     List<String> list = new ArrayList<>(); // the list is local to the method
     // do some work with the list
     return list.size();
 }

スレッドセーフでないコードの例:

 public int foo(String a, String b) {
     List<String> list = SomeClass.getSomeStaticListReference(); // the list is shared between threads
     // do some work with the list
     return list.size();
 }
于 2012-06-30T10:03:26.433 に答える