1. 程式人生 > >讀java多執行緒程式設計核心技術總結

讀java多執行緒程式設計核心技術總結

第一章 java 多執行緒技能

程序是作業系統的結構基礎;是一次程式的執行。執行緒可以看成程序的一個子任務。執行緒可以通過繼承Thread類或者實現runnable介面來實現。介面的實現優於繼承。

停止執行緒可以通過拋異常,return;或者暴力手段stop();stop停止執行緒過於暴力,容易造成資料缺失,所以不建議

暫停執行緒suspend()和resume方法的使用

執行緒安全

通過synchronized同步方法實現通過synchronize(監視器物件){}同步快來實現同步

髒讀:執行緒在讀取例項變數的時候,此值已經被其他執行緒更改了

當同步快出現異常時,鎖自動釋放

同步塊可以有效的縮減同步的範圍,縮短執行時間提高效率。

靜態同步方法鎖定的是Class類。靜態同步方法對所有執行該方法是執行緒都是同步的

死鎖的原因是

互斥條件。即某個資源在一段時間內只能由一個程序佔有

不可搶佔條件。程序所獲得的資源在未使用完畢之前,資源申請者不能強行地從資源佔有者手中奪取資源

佔有且申請條件。程序至少已經佔有一個資源,但又申請新的資源;由於該資源已被另外程序佔有,此時該程序阻塞

迴圈等待條件。存在一個程序等待序列{P1,P2,...,Pn},其中P1等待P2所佔有的某一資源,P2等待P3所佔有的某一資源,以此類推

只要監視器物件沒有改變,監視器物件的屬性改變了,執行的結果還是同步的

valatile關鍵字

valatile主要保證了成員變數的一個可見性,主要運用場景是迴圈條件的關鍵字valatile和synchronized的比較:1、valatile是執行緒同步的輕量級實現,在效能上肯定要好於synchronized2、多執行緒訪問valitile不會發生阻塞,而synchronized會出現阻塞3、valatile能保證資料的可見性,但是不能保證原子性,而synchronized 可以保證原子性,也可以間接保證可見性4、valatile解決的是變數在多個執行緒之間的可見性,而synchronized關鍵字解決的是多個執行緒之間訪問資源的同步性

執行緒間通訊

wait()使執行緒停止執行,而notify使停止的執行緒繼續執行。執行完wait()方法是立馬釋放鎖 notify()執行完同步程式碼塊才會釋放鎖,在執行同步程式碼塊過程遇到異常也會釋放鎖通過位元組流實現執行緒間通訊PipedInputStream 和 PipedOutputStreamPipedReader和PipedWriter使用InputStream.connnect(OutputStream)使兩個stream之間產生通訊連結。可以使用valatile修飾變數,用這個變數做開關實現交叉執行兩段程式碼的目的。join()方法釋放當前執行緒的鎖,sleep()佔有鎖不釋放,類Threadlocal解決的是變數在不同執行緒間的隔離性,也就是不同執行緒擁有自己的值,不同執行緒的值是可以 儲存在Threadlocal進行儲存

lock的使用

reentrantlock在功能上更加強大,比如具有嗅探功能,多路分支通知功能,使用上更加靈活reentrantlock呼叫lock()加鎖,一定要在finally{}模組中呼叫unlock()方法進行解鎖使用condition實現等待/通知:可以呼叫condition await()方法和signal()方法來實現可以通過在呼叫reentrantLock構造器的時候傳入true和false來實現公平鎖和非公平鎖使用condition實現順序執行使用多個condition,每個condition服務於一個執行緒。再使用個靜態變數來控制喚醒指定的執行緒。使用reentrantReadWriteLock可以加快執行效率,在某些不需要操作例項變數的方法中,完全可以使用讀寫鎖來提升該方法的程式碼執行速度

定時器

Timer timer = new Timer()timer schedule(task,dateRef):在指定時間執行任務TimeTask是以佇列的方式一個一個順序執行的 所以執行的時間有可能和預期的時間不一致,因為前面的任務如果耗時較長,後面的任務執行時間就會順延。timer schedule(task,datefirst,period)在指定時間以後週期性執行任務