2009-10-21 ダブルチェックの代わりに・・・
ダブルチェックの代わりに・・・
JSR 133に、Javaのメモリモデルについての情報がある。
そして、この情報は和訳されている様子。
http://www.javareading.com/bof/cookbook-J20060917.html
reorderとか、volatileの話など、かなりマニアックな情報だ。
さらに、FAQの話もある。先のダブルチェックはNGという話もここに情報が・・・
http://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
このようにすれば、複数スレッドからアクセスされても安全な実装になるらしい。
public class InitializeOnDemandHolder { private static class LazyHolder { public static InitializeOnDemandHolder singleton = new InitializeOnDemandHolder(); } public static InitializeOnDemandHolder getInstance() { return LazyHolder.singleton; } private InitializeOnDemandHolder(){ } private Object object = new Object(); public getObject(){ return object; } }
考えましたなぁ・・・
この実装では、synchronizedやvolatileを使っていない。すなわち、パフォーマンスの低下はない。
private static なインナークラスを持ち、その中で自分を初期化している。
privateであるため、外部から直接アクセスされることはない。
staticなのでInitializeOnDemandHolderクラスがClassLoadされた際に、LazyHolderは初期化される。
ClassLoadの時点で行われるということは、そのJVM内で基本的には一度しか呼ばれないことを意味する。
この一度しか呼ばれないタイミングをうまく活用してSingletonを実現する実装、というところか。
ダブルチェックでは、二度synchronizedが必要なことを考えるとこっちの方がやっぱり画期的。
このパターンをしっかり覚えておかないと・・・
- 2 http://www.google.co.jp/search?hl=ja&q=optiplex+760+メモリ増設&lr=&aq=1r&oq=OptiPlex+760+mem
- 2 http://www.google.co.jp/search?q=nLite+英語キーボード&ie=Shift_JIS&oe=Shift_JIS&hl=ja
- 2 http://www.google.com/search?client=safari&rls=en&q=kcsync&ie=UTF-8&oe=UTF-8
- 1 http://blog-search.yahoo.co.jp/search?ei=UTF-8&p=無痛分娩&n=10&so=dd&merge=on&tflg=none&sq=M&b=3
- 1 http://search.yahoo.co.jp/search?p=シェルスクリプト+文字列+連結&ei=UTF-8&fr=top_ga1_sa&x=wrt
- 1 http://search.yahoo.co.jp/search?p=OpenSSL+設定ファイル&ei=UTF-8&pstart=1&fr=top_ga1_sa&b=141
- 1 http://www.google.co.jp/m?ie=Shift_JIS&q=リニアサーチ
- 1 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.gentoo:ja:official&num=50&newwindow=1&q=winnt.sif+キーボード 指定&btnG=検索&lr=&aq=f&oq=
- 1 http://www.google.co.jp/search?hl=ja&client=firefox-a&rls=org.mozilla:ja:official&hs=q4f&q=Vostro 1200+nLite&btnG=検索&lr=lang_ja&aq=f&oq=
- 1 http://www.google.co.jp/search?hl=ja&lr=&q=リニアサーチ&revid=1289257957&ei=UDHgSrinA4SG6AP_7524Cw&sa=X&oi=revisions_inline&resnum=0&ct=broad-revision&cd=1&ved=0CBwQ1QIoAA