2016年6月20日のブックマーク (1件)

  • String#intern したオブジェクトをロックオブジェクトとして使ってはいけない - にょきにょきブログ

    「文字列をロックオブジェクトとして利用したい」場合がある。 例えば渡されたファイルに処理をするメソッドで、ファイルごとに排他処理をしたいとする。しかしファイルをそのままロックオブジェクトとして使ってはいけないのは明らかだ。File インスタンスは同じファイルを指していても別のインスタンスだからだ。 // これをやってはいけない! public void doSomething(File file){ synchronized(file){ ... } } これを回避しようとして、ファイルの絶対パスをロックオブジェクトとして使う案が出てくる。しかしこれもやってはいけない。理由は上記ファイルと同様、同じ文字列を持つオブジェクトであっても別々のインスタンスであることがあるからだ。 // これをやってはいけない! public void doSomething(File file){ String

    String#intern したオブジェクトをロックオブジェクトとして使ってはいけない - にょきにょきブログ
    db373db_ulsystems
    db373db_ulsystems 2016/06/20
    session.intern()を使ってロック(synchronized)することの危険性と対策