俺のメモ帖

とあるインフラ系SEのメモ帖。趣味や技術的なもとか書けたらいいなぁ。

【Java】Syncronizedつけた時に嵌った落とし穴

JavaでSyncronizedをつけると、複数のスレッドが同時に同じメソッドなりを実行できなくすることができる。

ただし、複数のスレッドがほぼ同時に当該メソッドなりを実行する場合に、スレッドが

そのメソッドを呼んだ順に必ず実行されるわけではない(実行順序が呼んだ順になるkとを保証されていない)

 

つまりは、想定どおりの早い者勝ちの順序でスレッドが動かないことがある。

1番目にメソッドを呼んだスレッドが最後に動くような順序の入れ替えが起こることがある。

自分の場合、なぜかいつもFILOみたいな動作になってた。なんでや。

 

Java」+「Syncronized」でググると、まるで呼び出した順に実行されるような説明をしてるページが結構あって、勘違いするだろうさね。

 

じゃあ、実行順を呼んだ順になるように保証されるように、排他制御かけるにはどうすればいいの?ってことだが、それには『ReentrantLock』ってクラスを使えばできるようだ。

ReentrantLock (Java Platform SE 7)

このクラスの2つ目のコンストラクタを使って、引数にTrueを指定して明示的にロックをかければよい。
※指定しない場合は、Falseが指定されたときと同じで、順序が保証されません。

 

個人的には、何も指定しないデフォルトの場合こそ実行順序保証してほしいんだけど、そうじゃないってことは、なんか理由があるのかなー?

 

実際に業務とかで使ってみて、こういう経験しないと知ることがないよね、こういうのって。