Java の synchronized はメソッドに指定するだけではなく、ブロックにも指定出来るらしい。
こんな感じ
synchronized (<object>) { // ロック中! }
でこの、
class Hoge {
static int a
void hoge1() {
synchronized (a) // int なのに、synchronized に渡せる! {
a++
}
}
}
Thread.start {
def h = new Hoge()
(1..100000).each { h.hoge1() }
println "end1"
}
Thread.start {
def h = new Hoge()
(1..100000).each { h.hoge1() }
println "end2"
}
Thread.sleep(1000)
println Hoge.a // あれ 200000 にならない時がある?
あと、メソッドに synchronized を指定した場合、static メソッドじゃない場合は、そのインスタンスがロック対象になるんだね〜、ちゃんと理解してなかったよ。
スレッドセーフではないはず。
class Hoge { static int a synchronized void hoge1() { a++ } }スレッドセーフのはず。
class Hoge { static int a synchronized static void hoge1() { a++ } }