JWorld@TW the best professional Java site in Taiwan
      註冊 | 登入 | 全文檢索 | 排行榜  

» JWorld@TW » Software Design » Effective Java  

按列印兼容模式列印這個話題 列印話題    把這個話題寄給朋友 寄給朋友    訂閱主題
reply to postflat modego to previous topicgo to next topic
本主題所含的標籤
無標籤
作者 Re:[問題]Item 48 [Re:sebastian_hsu]
metavige

metavige

版主

發文: 2133
積分: 10
於 2004-03-09 21:34 user profilesend a private message to usersend email to metavigereply to postreply to postsearch all posts byselect and copy to clipboard. 
ie only, sorry for netscape users:-)add this post to my favorite list
OK, 程式是這樣的
1
2
3
4
5
6
7
8
9
10
11
12
// The double-check idiom for lazy initialization - broken!
private static Foo foo = null;
 
public static Foo getFoo() {
  if (foo == null) {
    synchronized (Foo.class) {
      if (foo == null) {
        foo = new Foo();
      }
    }
  }
}


所謂 "尚未完整初始化的物件" 指的就是
1
private static Foo foo = null;

因為還未產生一個 instance 給 foo, 只是定義 foo 為 Foo 的型別而已.

至於說如果沒有同步控制, 會造成的災難性的失敗(我個人是覺得有點誇大啦, 當然有些情況下的確是災難, 尤其是客戶追著你跑的時候)
這樣說好了, 試想有兩個執行緒同時執行 getFoo()
如果沒有 synchronized
只有 foo == null 的判斷
那這兩個執行緒同時執行
1
foo == null
的判斷, 但也都還未執行到
1
foo = new Foo();
的敘述, 則當這兩個執行緒同時執行到這一行的時候, 就會發生錯誤.
先指定的敘述會成功, 後執行的敘述會失敗
因為
1
private static Foo foo = null
的宣告

但是要寫測試程式的話, 這個時間點要抓的很奧妙, 通常是在多人使用的系統裡面才比較容易模擬的出來.

不知道這樣是不是能夠解答你的問題?

呵呵, 這個討論區第一次有人問問題耶~ Big Smile
希望我回答的還可以~


reply to postreply to post
請各位新手參考 論壇規範Java 新手 FAQ
話題樹型展開
人氣 標題 作者 字數 發文時間
5766 [問題]Lazy Initialization的雙重檢驗手法? sebastian_hsu 349 2004-03-09 16:10
4822 Re:[問題]Item 48 metavige 851 2004-03-09 21:34
4857 Re:[問題]Item 48 metavige 197 2004-03-09 21:52
4803 Re:[問題]Item 48 sebastian_hsu 708 2004-03-09 23:54
5284 Re:[問題]Item 48 koji 123 2004-03-09 23:58
» JWorld@TW »  Software Design » Effective Java

reply to postflat modego to previous topicgo to next topic
  已讀文章
  新的文章
  被刪除的文章
Jump to the top of page

JWorld@TW 本站商標資訊

Powered by Powerful JuteForum® Version Jute 1.5.8