Java併發程式設計的藝術 筆記2

2021-08-13 06:25:55 字數 1865 閱讀 5769

現代作業系統排程的最小單位是執行緒,也叫輕量級程序,每個程序可建立多個程序,每個執行緒都有各自的計數器、堆疊和區域性變數等屬性,並且能夠訪問共享變數。處理器在這些執行緒上高速切換,讓使用者感覺到這些執行緒在同時執行。

執行緒優先順序:決定執行緒分配處理器資源多少的屬性,設定時,針對頻繁阻塞(休眠或i/o操作)的執行緒需要設定較高優先順序,而偏重計算的執行緒則設定較低優先順序。在不同作業系統上會有差異,有的作業系統甚至會忽略執行緒優先順序的設定。

daemon執行緒:守護執行緒,主要被用作程式中後台排程以及支援行工作。

通過thread.setdaemon(true)設定守護執行緒,且daemon需要在啟動執行緒前設定。

虛擬機器中不存在非daemon執行緒時就會退出。虛擬機器退出時daemon執行緒不能通過finally塊中的內容來確保執行關閉或清理資源的邏輯。

1.執行緒的啟動:執行緒物件初始化完成後呼叫start()方法就能啟動執行緒。

2.中斷:可以理解為執行緒的乙個標識位屬性,通過呼叫執行緒的interrupt()方法設定該標識。方法丟擲interruptedexception之前,虛擬機會先將執行緒的中斷標識清除。使用標識位和中斷的方式能夠使執行緒在終止時有機會去清理資源,這種方法顯得更安全和優雅。

1)volatile和synchronized關鍵字

volatile修飾字段,告知執行緒對變數的訪問要從共享記憶體內獲取,而對它的改變必須同步重新整理回共享記憶體,保證所有執行緒對變數訪問的可見性。

synchronized確保多個執行緒在同一時刻,只能有乙個執行緒處於方法和同步塊中,保證了執行緒對變數訪問的可見性和排他性。

任意乙個物件都有自己的監視器,當這個物件由同步塊或者這個物件的同步方法呼叫時,執行方法的執行緒必須先獲取到監視器(執行該方法)的執行緒將會被阻塞在同步塊和同步方法的入口處,進入blocked狀態。當獲得了鎖的執行緒釋放了鎖,則鈣釋放操作喚醒阻塞在同步佇列中的執行緒,使其重新嘗試對監視器的獲取。

物件、監視器、同步佇列和執行執行緒之間的關係

2)等待/通知機制

等待/通知機制依託於同步機制,目的是確保等待執行緒從wait()方法返回時能夠感知到通知執行緒對變數做出改變。

等待/通知機制的經典正規化:

等待方:1.獲取物件的鎖。2.如果執行條件不滿足,那麼呼叫物件的wait()方法,被通知後仍要檢查條件。3.條件滿足則執行對應的邏輯。

通知方:1.獲得物件的鎖。2.改變條件。3.通知所有等待在物件上的執行緒。

3)管道輸入輸出流

主要用於執行緒之間的資料傳輸,而傳輸的媒介為記憶體。

包括如下的具體實現:pipeoutstream、pipeinputstream、pipedreader、pipedwriter,前兩種面向位元組,後兩種面向字元。

使用時必須將輸入輸出流通過out.connect(in)方法進行對接,否則丟擲ioexception。

4)thread.join()

如果乙個執行緒a執行了thread.join()語句,其含義是:當前執行緒a等待thread執行緒終止之後才從thread.join()返回。

join()方法的邏輯結構和等待通知機制的經典正規化相同。

執行緒池預先建立了若干數量的執行緒,並且不能由使用者直接對執行緒的建立進行控制,在這個前提下重複使用固定或較為固定的數目來完成任務的執行。

這樣做的好處是,一方面,消除了頻繁建立和消亡執行緒的系統資源開銷,另一方面,面對過量任務的提交能夠平緩的劣化。

乙個簡單的執行緒池介面的定義:

public

inte***ce

threadpool

extends

runable>

Java併發程式設計的藝術 筆記

併發存在的問題 上下文切換耗時,死鎖,軟硬體資源限制 解決方法 減少上下文切換 1.無鎖併發程式設計 讓不同的執行緒處理不同的資料段 將資料id採用hash演算法分配給不同的執行緒 2.cas演算法 compare and set使用jni 3.使用最少執行緒 減少處於waiting狀態的執行緒 j...

《併發程式設計的藝術》 筆記

記錄 j a 併發程式設計的藝術 部分知識點 volatile synchronized 用來闡述記憶體之間的可見性 任意乙個j a物件,都擁有一組監視器方法 定義在object上 主要包括wait nofify notifyall 等 這些方法與synchronized同步關鍵字配合可以實現等待 ...

Java併發程式設計的藝術 讀後記要 2

傳統的解決方法很簡單。如果是單個資料的話,對資料使用volatile關鍵字修飾,這個關鍵字可以保證資料不會停留在cpu的寫快取中,而是寫入記憶體,下一次對該資料的讀取一定讀到的記憶體中的最新資料。也就是解決了可見性問題。但是volatile變數原子性還有問題,對volatile變數多執行緒下的自增自...