Java併發程式設計實踐 筆記(節選)

2021-09-01 14:35:12 字數 945 閱讀 3680

1.executor:

1).為什麼會有executor? 無限的建立執行緒會導致浪費很多的資源,執行緒頻繁的掛起與喚醒都會影響效能。executor就充當了執行緒池的一部分。

2).常見的執行緒池是executors.newfixedthreadpool .它可以生產乙個定長的執行緒池,當執行緒池中的執行緒不夠用的時候就到生產乙個執行緒直到達到額定的執行緒數。這時候執行緒的長度就不會再改變。還有例如newcachethreadpool可以根據當前使用情況,**空閒執行緒。還有例如:scheduledthreadpool,這個執行緒池可以用來代替timer。timer有如下兩個問題:一.如果執行耗時的任務,有可能出現同乙個時間點應該執行兩個或以上的任務,這時候其中乙個或多個任務可能會丟失,或者被重複執行。二:如果上乙個任務拋了執行時異常以後,後面的任務就丟失了。scheduledthreadpool多執行緒定時執行,可解決以上兩個問題

3).executorservice還能聯合future使用,使用executor.submit(callable xx) 然後返回乙個future 。

2.future:

1).為什麼要有future?以往乙個執行緒執行乙個任務之後就無法知道該任務的狀態,運**況,更加不能停止該任務,例如這個任務已經不需要執行了,我們還不能把它停掉,白白浪費效能。future提供查詢任務的狀態,是否完成,是否已取消,並且可以取消執行任務。並且額外還提供阻塞返回和定時阻塞返回。

2).典型的實現是futuretask

3.completeservice

1.為什麼要用completeservice?使用executorservice.submit返回乙個future之後,可以一直迴圈判斷future是否完成,然後拿結果。更好的辦法是使用completeservice. completeservice可以把已完成的future放到乙個blockingqueue中,然後我們只管從中取future就可以了。

4.blockingqueue

java併發程式設計實踐

chapter 2 執行緒安全 常見的競爭條件包括檢查在執行,讀 改 寫.典型的檢查再執行操作為延遲初始化 if is null then.典型的讀 改 寫操作為自增運算 x 動態同步方法鎖住當前物件本身,靜態同步方法鎖住class物件 chapter 2 可見性 讀讀不需要同步,讀寫,寫寫需要.當...

java併發程式設計實踐 ThreadLocal

threadlocal 的功能,能夠為各個訪問的執行緒copy出初始化後的資源副本,因此各個訪問資源的執行緒在改變資源狀態的時候,只是改變分配給該執行緒副本的狀態,因此各個執行緒之間沒有干擾,可以按照各自設定的序列執行。對比 如下 uniqueint與itest分別為兩個integer型別的資料。u...

Java併發程式設計實踐(2)

1 同步容器類 hashmap和hashtable的區別 hashmap底層繼承abstractmap抽象類,並實現map介面,hashtable底層繼承dictionary類並實現map介面 hashmap初始話大小為16而hashtable初始化大小為11,hashmap是非執行緒安全的而has...