主に以下のような書き方で排他制御を実現できる。
Class ClassA {
//呼び出し元のオブジェクトをロックする。
//ClassA obj1 = new ClassA(); ClassA obj2 = new ClassA();とした場合には
//インスタンスが異なるため、排他制御せずに別々に実行されるので注意
synchronized void func1(){
}
//関数内にsynchronizedをつけ、呼び出し元のオブジェクトをロックする。
//内容的には上のsynchronized関数と同意だが、上の表記の方が早い。
//ただし、synchronized(this)のthisを変えてsynchronized(オブジェクト名)とした
//オブジェクトごとのロック取得を実施できるので便利。
void func2() {
synchronized(this) {
}
}
//staticをつけたクラス関数の場合にはロックする対象が呼び出し元のオブジェクトではなく、
//ClassAオブジェクトとなる。
synchronized static void func3() {
}
}
また、下のような書き方もできる。
ロック用変数lockを共有するオブジェクト同士は排他制御を実現できる。
Class ClassA {
private Object lock = new Object(); もしくは private byte[] lock = new byte[0];(後者の方が若干処理が早いはず)
void func1() {
synchronized(lock) {
}
}
}
最終更新:2012年07月16日 13:56