1. 程式人生 > >(學習筆記)java-併發

(學習筆記)java-併發

一、併發的定義

    很多情況下,我們會通過順序程式設計來編寫我們的程式碼,因為順序程式設計會會使事物按照一定的規律或步驟去執行。

   有個腦筋急轉彎是這樣:

  一個平底鍋烙餅每次最多放四張,一面需要二分鐘,用六分鐘烙六張餅,要怎麼樣去完成?

有個比較好的答案:

先烙四個的第一面2分鐘,那出2個,放入2個沒烙的的2分鐘,取出兩個烙完的,再放兩個烙完一面的2分鐘。 2+2+2=6(分鐘)

剛開始我一直在考慮,如果不考慮餅的感受,同樣在鍋裡的兩個餅一起被鍋烙,這是不是算得上

是一種併發操作呢?

最初我對併發的感覺是:有不只一個物件 與當前物件同時產生某種關係 那麼這個過程我覺得是併發

感覺像是初中學的並聯一樣,不過它真正的定義可不是這樣。

書上定義:對於某些問題,如果能並行的執行程式中的多個部分,這就是並行程式設計。 

感覺和自己理解的差不太多。

二、學習併發的理由

事實上,只要願意,程式中只通過順序程式設計也是可以實現的,不過聯絡到現實中,想想看,當你

在看視訊的時候,你不能在後臺下載其它視訊;當你在聽歌的時候,你不能在前臺悠哉的看小說;;

如果真的有這種問題,估計我會想把這個APP扔掉,因為不方便。所以為了讓使用者使用APP更加方便

應該就成為了研究併發的最好的理由。

三、併發會帶來什麼問題

有這麼個場景,大家都有過去公共衛生間的經歷。一個坑一個人。如果WC有人,那麼外面的人就只能等著了!但是假設在一個

人超多的地方,一個WC門口外邊等了好多人,下一個會是誰呢?兩個一起WC什麼的不敢想!下一個去WC的人有可能站的比較近,有可能力氣比較大,偶爾也看見過有人爭執起來,就為了一個WC而已!例子有點LOW,不過如果有兩個物件同時對一個資源產生需求的時候,它們可不會擁有人類的思考,不會懂得謙讓, 也不會自發排隊吧!這樣就非常有可能產生異常甚至崩潰。

四、併發的多面性

    用併發來解決問題可以分為"速度 "和"設計可管理性"

1、提升速度

 併發的最理想狀態,應該是每個任務都做為程序在其自己的地址空間中執行,因為任務之間不會互相干涉,在java中併發系統會對記憶體和、IO進行資源共享 ,所以編寫這種多執行緒的程式重點就在於如何去協調不同任務對這些資源的使用。

2、改進程式碼設計

利用協作多執行緒。在協作多執行緒中,從搶佔式的執行任務,到每個任務自動的放棄控制,這就要求程式設計師要有意識地在每個任務中插入停止任務的程式碼。

程序是獨立執行在自己地址空間內的自包容的程式。

五/

1、加入一個執行緒

一個執行緒可以在其他執行緒之上呼叫join()方法,此執行緒會被掛起,等當前執行緒結束後才會執行。

對join()方法的呼叫可以被中斷,做法是加入interrupt(),但是要加上try catch子句。

javaSE5 中 java.util.concurrent類包含諸如CyclicBarrier()比join更合適。

2、synchronized 

Java以提供關鍵字synchronized 的形式,為防止資源衝突提供了內建支援,

當程式執行到synchronized關鍵字保護的程式碼片段的時間,它將檢查鎖是否可用,

然後獲取鎖,釋放鎖。

共享資源一般是以物件形式存在的記憶體片段,為了控制外部程式對它的訪問,得先把它它進

一個物件,可以是檔案,也可以是輸入和輸出口

3、lock方法與snchronized相比有些粗糙,但是更細粒化。

它支援你長時間的獲取鎖,而且獲取一段時間,結果有可能會是