スレッドの安全を保証する方法スレッドの安全を実現するには、いくつかの方法があります.
1663 ワード
1スレッドのセキュリティを保証する方法
スレッド間でステータス変数を共有しない
状態変数を可変変数に変更する
状態変数へのアクセス時の同期の使用
2、スレッドセキュリティを実現するには、どのような方法がありますか.
A:内蔵ロック
この場合、子クラスが親クラスのロックを取得してデッドロックを起こさないため、子クラスが親クラスのロックを同期的に呼び出すことは可能です.
3 javaを使用します.util.concurrentパッケージで定義された同時クラスは、次のようになります.
ConcurrentHashMap
ConcurrentLinkedQueue
ConcurrentSkipListMap
など
しかし、彼らがサポートする同時実装は、必ずしも動作の原子性を意味するものではなく、データ構造が破壊されないことを保証するだけです.
4、volatileキーワードの追加
5、同期文の注意
同期ブロックをマークするオブジェクトを使用することができます.thisを使用しないでください.thisは現在のクラスを表す可能性があります.thisは同期の領域がクラス全体であるため、他のオブジェクトはクラスを呼び出すことができません.同期の方法ではありません.thisが指すクラスからロックが解放されるのを待つ必要があります.したがって、オブジェクトを定義し、同期ブロックのロックをオブジェクト全体に指向させて、同期ブロックのロックの影響範囲を縮小することができます.
6.同期ブロックで他の同期ブロックを呼び出さない
この言葉は絶対的ではありません.コードの同期、ロック、などの情報をよく知っていれば、大胆にすることができます.
スレッド間でステータス変数を共有しない
状態変数を可変変数に変更する
状態変数へのアクセス時の同期の使用
2、スレッドセキュリティを実現するには、どのような方法がありますか.
A:内蔵ロック
public class widget{
public synchronized void doSomething(){
.....
}
}
public class LoggingWidget extends Widget{
public synchronized void doSomething(){
System.out.println(toString()+":calling do Something");
super.doSomething();
}
}
この場合、子クラスが親クラスのロックを取得してデッドロックを起こさないため、子クラスが親クラスのロックを同期的に呼び出すことは可能です.
3 javaを使用します.util.concurrentパッケージで定義された同時クラスは、次のようになります.
ConcurrentHashMap
ConcurrentLinkedQueue
ConcurrentSkipListMap
など
しかし、彼らがサポートする同時実装は、必ずしも動作の原子性を意味するものではなく、データ構造が破壊されないことを保証するだけです.
4、volatileキーワードの追加
private static volatile int value=0;// volatile synchronized ,
public static void setTvalue(int n){
value=n// , value+=n , , synchronized
}
5、同期文の注意
同期ブロックをマークするオブジェクトを使用することができます.thisを使用しないでください.thisは現在のクラスを表す可能性があります.thisは同期の領域がクラス全体であるため、他のオブジェクトはクラスを呼び出すことができません.同期の方法ではありません.thisが指すクラスからロックが解放されるのを待つ必要があります.したがって、オブジェクトを定義し、同期ブロックのロックをオブジェクト全体に指向させて、同期ブロックのロックの影響範囲を縮小することができます.
private Object myLock=new Object();
public void add (int a ){
synchronized(myLock){
v+=a;
}
}
6.同期ブロックで他の同期ブロックを呼び出さない
この言葉は絶対的ではありません.コードの同期、ロック、などの情報をよく知っていれば、大胆にすることができます.