スレッド安全の深化研究
1389 ワード
1、スレッド安全とは? クラスがスレッドセキュリティのクラスになるということは、クラスが複数のスレッドによってアクセスされる場合、これらのスレッドが実行される環境に関係なく、どのようなタイミング・スケジュールまたはインターリーブが行われても、正しい動作が実行され、呼び出しコードには追加の同期がありません。
2、スレッドの安全問題はいつ考えられますか? クラスの例がsingletonである場合、このインスタンスは呼び出し時にスレッドが安全かどうかを考慮しなければならない。 最もよく知られている例はservletであり、各servletはservlet engineerの中に一つの例しかない。SingleThreadedインターフェースを実装しない限り。したがって、一般的には、スレッドが安全でないようにメンバー変数を定義しないでください。 singletonの対象はスレッドではないですか?答えはNoです。正確な表現としては、このクラスで状態のあるメンバーを定義している場合のみ、スレッドが安全ではないということです。例を挙げます
IDは状態がある変数です。状態とは、このクラスを呼び出すたびにID値が異なる場合がありますが、このIDは状態があります。
私たちは次の例を見てみます。
このクラスBは一例ではスレッドが安全です。理由は、このクラスには状態のあるメンバーがいないからです。i,jは局所変数であり、あるスレッドは自分のスタンクでこれらの局所変数を保存します。従って,これらの変数は異なるスレッドに対して相互に影響を及ぼさない。
スレッドが安全でないクラスが存在する場合、スレッドの安全問題はどうやって回避されますか?1、synchronizedで同期します。欠点はつまり渋滞問題があることです。2、ThreadLocal(実際にはHashMap)を使用して、このように異なるスレッドは自分の対象を維持し、スレッド間は互いに干渉しない。
まとめ:1、ビジネスロジックのBOはスレッドセキュリティのクラスであることが一般的に要求されています。このようにBOを単一のインスタンスのオブジェクトに作成して、アクセスの効率を向上させます。BOをスレッドの安全の対象とするために、私たちが簡単に行うべきことは、状態に関するメンバー変数がないことです。
2、スレッドの安全問題はいつ考えられますか? クラスの例がsingletonである場合、このインスタンスは呼び出し時にスレッドが安全かどうかを考慮しなければならない。 最もよく知られている例はservletであり、各servletはservlet engineerの中に一つの例しかない。SingleThreadedインターフェースを実装しない限り。したがって、一般的には、スレッドが安全でないようにメンバー変数を定義しないでください。 singletonの対象はスレッドではないですか?答えはNoです。正確な表現としては、このクラスで状態のあるメンバーを定義している場合のみ、スレッドが安全ではないということです。例を挙げます
public class A{
String id ;
public void process(){
print(id);
...
}
}
IDは状態がある変数です。状態とは、このクラスを呼び出すたびにID値が異なる場合がありますが、このIDは状態があります。
私たちは次の例を見てみます。
public class B{
public void process(){
int i;
int j;
println(i*y);
}
}
このクラスBは一例ではスレッドが安全です。理由は、このクラスには状態のあるメンバーがいないからです。i,jは局所変数であり、あるスレッドは自分のスタンクでこれらの局所変数を保存します。従って,これらの変数は異なるスレッドに対して相互に影響を及ぼさない。
スレッドが安全でないクラスが存在する場合、スレッドの安全問題はどうやって回避されますか?1、synchronizedで同期します。欠点はつまり渋滞問題があることです。2、ThreadLocal(実際にはHashMap)を使用して、このように異なるスレッドは自分の対象を維持し、スレッド間は互いに干渉しない。
まとめ:1、ビジネスロジックのBOはスレッドセキュリティのクラスであることが一般的に要求されています。このようにBOを単一のインスタンスのオブジェクトに作成して、アクセスの効率を向上させます。BOをスレッドの安全の対象とするために、私たちが簡単に行うべきことは、状態に関するメンバー変数がないことです。