Evan's Blog

          Java, software development and others.

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

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

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

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

          Chapter 5. Minimal Synchronization Techniques

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

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

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

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

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

          5.2 Atomic Variables
          (略)

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

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

          5.3.1 Inheritable Thread Local Variables

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

          posted on 2006-03-11 23:11 Evan 閱讀(1657) 評論(0)  編輯  收藏 所屬分類: Java筆記
          主站蜘蛛池模板: 全椒县| 通道| 大邑县| 定襄县| 西平县| 光山县| 游戏| 罗定市| 施甸县| 武山县| 兰考县| 南岸区| 洛宁县| 乌兰察布市| 德钦县| 通海县| 白山市| 乐至县| 富顺县| 化隆| 巴南区| 和田县| 安吉县| 黔东| 泰安市| 静宁县| 北宁市| 宜兴市| 安化县| 平江县| 余庆县| 大方县| 沙湾县| 共和县| 天镇县| 达日县| 泾川县| 万宁市| 桦南县| 双辽市| 临沧市|