<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    Evan's Blog

    Java, software development and others.

      BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
      28 隨筆 :: 0 文章 :: 73 評論 :: 0 Trackbacks

    《Java Threads》的第5章"Minimal Synchronization Techniques",是這本書中到現在我認為最差的一章了,當然主要是我不喜歡JDK 1.5新推出的Atomic Class,而這一章卻花了不少篇章來介紹,且牽強地改造打字程序,又語焉不詳地指出這種改造的困難之處和可能帶來的副作用,但卻又不能從代碼的實際運行中看到這種副作用,很有誤導初學者的嫌疑。不過,我想,沒有哪個初學者會冒風險為了用Atomic Class而將原本簡單明了的算法改造得如此晦澀難懂,并且還有潛在的出錯風險。所以,對于Atomic Class,我建議跳過不讀,絕對沒有什么損失。不過對于其中"5.1.3 Double-Checked Locking"和"5.3 Thread Local Variables"這兩節倒要著重讀一讀,尤其是Thread Local,應該說是Java中一個比較重要的多線程工具。

    讀到這里,我突然發覺,作為偏參考書的技術書籍,實在不適宜從頭到尾采用一個例子,然后結合章節的推廣來不斷改進這個例子。因為,各章節相對獨立,而讀者可能挑任何章節來閱讀,那么就會被例子搞到不知所云。所以,如果是我,則會為每個概念或類編寫一些小的有針對性的例子,來清除明白地演示其作用。

    好了,廢話少說。既然看了,還是留下些筆記吧。

    Chapter 5. Minimal Synchronization Techniques

    由于同步以及鎖的獲取、釋放和等待都是比較費時的操作,因此這一章將介紹JDK 1.5新引進的Atomic Classes來避免顯示的同步。在這一章的開頭簡單介紹了Java的內存模型,可以幫助開發者更好地體會Java線程同步的機制。

    5.1 Can You Avoid Synchrnoziation?
    1. 多線程開發人員常患有同步狂想癥。有太多的關于過度或者錯誤的同步導致程序運行低下的悲慘故事。由于獲取鎖需要更多額外的操作,以及必須等待當前擁有鎖的線程釋放鎖,導致同步變成了一個十分昂貴的操作。
    2. 是否能夠避免使用同步呢?在極少數情況下,可以通過使用volatile變量來避免顯示同步的使用;但大多數多線程環境中顯然無法避免。
    3. 計算機一般通過盡量將數據保存在寄存器以及調整語句的執行順序來優化程序。

    5.1.1 The Effect of Registers
    當虛擬機進入一個同步方法或同步塊時,它會重新裝載緩沖在本地寄存器中的數據;當離開時,則將寄存器中的內容重新寫入主存中。

    5.1.2 The Effect of Reordering Statements
    同步塊同樣會組織語句的重新排列。虛擬機不能將語句從同步塊的內部移到同步塊的外面。

    5.1.3 Double-Checked Locking
    當需要在多線程環境下使用單件模式(Singleton Patter)時,為了避免多個對象的創建,就需要使用同步,但如果每次獲取對象都同步則會相當影響性能,因此,就推出了Double-Checked Locking模式。但在早期的JVM中可能會導致錯誤,在http://www.cs.umd.edu/~pugh/java/memeoryModel 有詳細的說明,值得一讀。倒不是去驗證可能的錯誤,那篇文章畢竟是98年寫的,在現在的JVM中基本上不可能重現這個錯誤,而是可以很好地了解一下這個設計模式的來歷和作用。

    5.2 Atomic Variables
    (略)

    5.3 Thread Local Variables
    1. 通過Thread Local可以自動為每個線程保留一份私有拷貝,并且這個過程對調用者來說是透明的。
    2. JDK 1.5將ThreadLocal轉化成了泛類(Generic Class),可以加強類型檢測,并在每次獲取時不再需要類型轉換。
    3. 常見的使用方法:

    private static ThreadLocal<HashMap> results = new ThreadLocal<HashMap>() {
        protected HashMap initialValue() {
            return new HashMap();
        }
    }
    4. ThreadLocal的一個應用就是實現數據庫的事務控制,可以參考Spring的代碼,當然不一定要那么復雜。 

    5.3.1 Inheritable Thread Local Variables

    IBM DW上的這篇文章輕松使用線程: 不共享有時是最好的不錯,如果要學習ThreadLocal,一定要看看這篇文章:)。

    posted on 2006-03-11 23:11 Evan 閱讀(1656) 評論(0)  編輯  收藏 所屬分類: Java筆記
    主站蜘蛛池模板: 亚洲嫩模在线观看| 国产青草视频在线观看免费影院| 无码人妻一区二区三区免费视频 | 在线免费观看亚洲| 日韩精品在线免费观看| 在线观看人成视频免费无遮挡| 青娱乐在线视频免费观看| 国产亚洲美女精品久久久久| 精品国产日韩亚洲一区在线| 国产成人精品亚洲一区| 激情小说亚洲图片| 青娱乐在线免费观看视频| 一边摸一边桶一边脱免费视频 | 亚洲精品国产精品乱码在线观看 | 久久成人国产精品免费软件| 欧洲精品99毛片免费高清观看 | 亚洲色大成网站www| 亚洲色无码国产精品网站可下载| 亚洲国产综合精品中文第一| 亚洲欧美国产欧美色欲| 亚洲a∨无码精品色午夜| 无码天堂亚洲国产AV| 人妻仑乱A级毛片免费看| aa级女人大片喷水视频免费| 免费av片在线观看网站| 7x7x7x免费在线观看| 免费无码又爽又刺激聊天APP| 午夜免费福利影院| xvideos亚洲永久网址| 国产亚洲综合网曝门系列| 中文字幕亚洲精品资源网| 亚洲色最新高清av网站| 成人免费视频一区二区| 成全动漫视频在线观看免费高清版下载| baoyu122.永久免费视频| 午夜免费1000部| 日本xxwwxxww在线视频免费 | 2019中文字幕在线电影免费| 免费A级毛片无码免费视| 亚洲成?v人片天堂网无码| 亚洲国产成人片在线观看无码 |