好讀書不求甚解(一)Java多線程編程核心技術

來源:互聯網
上載者:User

第1章 Java多線程技能 第2章 對象及變數的並發訪問 1 synchronized同步方法 2 synchronized同步代碼塊 3 volatile 第3章 線程間通訊 1 等待通知機制 2 join方法 3 ThreadLocal類 第4章 Lock的使用 1 ReentrantLock類 2 ReentrantReadWriteLock類 第5章 定時器Timer 第6章 單例模式與多線程 第7章 拾遺增補 內容總結 不好的地方 好的地方

看書經常看過後就沒多少印象了,決定把看的做個簡單記錄或者摘要,用於加深印象.
第1章 Java多線程技能

1) 實現多線程變成的方式主要兩種,一種是繼承Thread類,一種是實現Runnable介面2) currentThread()方法,傳回碼段正在被哪個線程調用.要注意Thread.currentThread()和this的區別3) isAlive()方法,判斷當前線程是否處於活動狀態.活動狀態指線程已經啟動且尚未終止4) sleep()方法,當前正在執行的線程休眠指定時間,不釋放鎖5) 停止線程的方法,正常停止(執行結束),stop方法(已廢棄),interrupt方法6) interrupted(),靜態方法,測試當前線程是否已經中斷,並清除中斷標識7) isInterrupted(),執行個體方法,測試線程是否已經中斷,不清除中斷標識8) sleep的線程也可以停止(需要捕獲異常)9) yield()方法,讓出CPU給其他線程,也可能讓出後自己又搶到10) 線程優先順序,盡量不使用11) 守護線程,java線程分兩種,使用者線程,守護線程.進程中沒有使用者線程後,守護線程自動銷毀
第2章 對象及變數的並發訪問 2.1 synchronized同步方法
1)方法內變數為安全執行緒(在棧上)2)執行個體變數非安全執行緒(在堆上)3)synchronized方法是鎖定的執行個體對象,多個執行個體不互斥4)鎖可重新進入5)出現異常,自動釋放鎖
2.2 synchronized同步代碼塊
1) 同步代碼塊通過減少同步的範圍,來提高效率2) synchronized() 參數如果不一個,則是非同步3) synchronized(class)鎖定class對象=synchronized static方法4) synchronized代碼塊盡量別用String作為鎖對象
2.3 volatile
1) volatile修飾的變數具有可見度.即線程使用時都要從主記憶體讀取.2) volatile不具備原子性3) 結合1,2兩點, volatile適合只有一個線程修改資料,或者像一個線程修改flag=false,別的線程都停止這種.4) 原子類也並不完全安全(方法間不同步),類似Hashtable
第3章 線程間通訊 3.1 等待/通知機制
1) wait()方法使當前執行代碼的線程進行等待.會立即釋放鎖2) notify()方法通知呈wait狀態且等待這個鎖的線程,如果多個則隨機通知一個.會釋放鎖,但不是立即,要等同步地區內代碼執行完成3) notifyAll()方法通知呈wait狀態且等待這個鎖的全部線程,釋放鎖和notify方法一樣4) 上面1,2,3都會釋放鎖,所以執行前都需要已經獲得鎖5) sleep()方法不釋放鎖6) wait()的線程,調用interrupt()方法會拋出InterruptedException7) wait(long)是long時間內沒有被喚醒的話,則自動被喚醒8) 多生產者,多消費者 如果使用notify可能喚醒的是同類,可能出現假死情況.使用notifyAll來解決9) 可以使用PipeInputStream,PipedOutputStream,PipedReader,PipedWriter實現線程間通訊
3.2 join方法
1) join()的作用是使所屬的線程對象x正常秩序run()中的任務,而使當前線程z阻塞到線程x銷毀後再執行2) join()是使用wait()方法實現的,synchronized是使用的"對象監視器"3) 啟動線程b,b中啟動線程a,然後a.join(),如果b.interrupt(),則b拋出異常,a正常執行4) join(long)比起join()多了個阻塞的時間,和sleep(long)的區別是join會釋放鎖(因為是用wait實現的)
3.3 ThreadLocal類
1) 各線程可以用ThreadLocal來存放私人資料.set()設定,get()返回(為什麼不弄個map那樣子的呢,呵呵)2) get()的初始化值,可以通過extends ThreadLocal,override initialValue()實現
第4章 Lock的使用 4.1 ReentrantLock類
1) synchronized結合wait(),notify(),notifyAll()可以實現等待/通知模式,ReentrantLock藉助Condition對象實現等待/通知模式2) 使用notify()被通知的線程是JVM隨機選的,Condition類可以自己選擇3) Object.wait()相當於Condition.await(),Object.notify()相當於 Condition.signal()4) await()和signal()方法使用前需要獲得鎖5) new ReentrantLock(boolean isFair) 可以指定是否為公平鎖,不過公平鎖也不是絕對公平的6) 以下7-9是ReentrantLock類的一些方法說明7) getHoldCount()返回調用lock()的次數,getQueueLength()返回正等待擷取此鎖的線程估計數,getWaitQueueLength(condition)返回正等待擷取此鎖此條件的線程估計數8) hasQueuedTread(Thread thread)返回指定線程是否正在等待擷取此鎖,hasQueuedThreads()返回是否有線程正在等待擷取此鎖,hasWaiters(condition)返回是否有線程正在等待此鎖此條件9) isFair()返回是否公平鎖,isHeldByCurrentThread()返回當前線程是否持有此鎖,isLocked()返回此鎖是否由任意線程持有
4.2 ReentrantReadWriteLock類
1) 讀讀共用,讀寫互斥,寫寫互斥,寫讀互斥
第5章 定時器Timer
書裡只是講了怎麼使用,可以直接去看API文檔,而且現在項目開發一般都使用封裝過的spring task或者quartz,所以這裡就不記錄了
第6章 單例模式與多線程
1) 在部落格 http://blog.csdn.net/qq315737546/article/details/29387381 中對單例模式有過說明2) 最好使用枚舉來實現單例,可以用class再封裝一層(6.7的例子)
第7章 拾遺增補
1) Thread.State 枚舉中,列出了線程的所有狀態,並有解釋


2) 線程狀態通過有關方法進行切換,有些切換是單向的
3) 可以把線程歸屬到某一個線程組中,統一管理
4) SimpleDateFormat是非安全執行緒的
5) 線程異常可以通過UncaughtExceptionHandler進行捕獲.可以setDefaultUcaughtExceptionHandler()設定預設的異常處理器
6) 預設情況下,線程組中一個線程出現異常不會影響其他線程,可以通過自訂線程組+重寫uncaughtException()方法來停止組內所有線程
7) 線程異常處理 thread.setUncaughtExceptionHandler()>Thread.setDefaultUncaughtExceptionHandler()>線程組的異常處理 內容總結

1.  使用synchronized(同步方法,同步代碼塊),lock的時候,重點在於知道他們使用的對象監視器是否一個(即加鎖的對象)2.  lock比synchronized更強大,更靈活
不好的地方
1.  書裡大部分例子都是用的XX extend Thread來實現, 這種實現可以直接調用XX執行個體xx.start()方法執行即可.不需要再Thread t = new Thread(xx), 我認為實現Runnable方式這樣寫更合適.(Thread類本身也實現了Runnable介面.....)2.  有些地方有結論,有代碼,但是沒有說明,搞的有點不理解3.  有些地方只有代碼... 更難理解
好的地方
1.  程式碼範例很多,觀點都通過代碼去證明2.  很多時候,對一些知識點不知道怎麼去驗證,這本書能加強舉例子的能力

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.