Java中並發問題整理

來源:互聯網
上載者:User

標籤:user   arraylist   使用者   cas   回收   可中斷的鎖擷取   垃圾   面積   沒有   

1. java中有幾種方法可以實現一個線程?

使用Runnable,Callable,Thread或者線程池

2. 如何停止一個正在啟動並執行線程?

可以使用正在啟動並執行線程,支援線程中斷,通常是定義一個volatile的狀態變數,在運行線程線程中讀這個變數,其它線程中修改這個變數

3.sleep和wait有什麼區別

sleep方法是在指定的時間內讓正在執行的線程暫停執行,但不會釋放鎖。而wait方法是讓當前線程等待,直到其他線程調用對象的notify或notifyAll方法。wait方法會釋放掉鎖,使別的線程有機會佔用鎖

4.notify()和notifyAll()有什麼區別?

notify是隨機喚醒一個等待某個資源的線程,進入就緒隊列等待CPU的調度,notifyAll是喚醒所有的,進入就緒隊列等待CPU調度

5.介紹下daemon線程

在Java中有兩類線程:User Thread(使用者線程)、Daemon Thread(守護線程) 。Daemon的作用是為其他線程的運行提供便利服務,比如記憶體回收線程就是一個很稱職的守護者。User和Daemon兩者幾乎沒有區別,唯一的不同之處就在於虛擬機器的離開:如果 User Thread已經全部退出運行了,只剩下Daemon Thread存在了,虛擬機器也就退出了。

6.樂觀鎖和悲觀鎖的理解及如何?,有哪些實現方式

樂觀鎖,每次操作時不加鎖而是假設沒有衝突而去完成某項操作,如果因為衝突失敗就重試,直到成功為止

悲觀鎖是會導致其它所有需要鎖的線程掛起,等待持有鎖的線程釋放鎖。

樂觀鎖可以使用volatile+CAS原語實現

悲觀鎖可以使用synchronize的以及Lock

7.如何讓一段程式並發的執行,並最終匯總結果?

使用CyclicBarrier 在多個關口處將多個線程執行結果匯總 ;CountDownLatch 在各線程執行完畢後向匯流排程彙報結果

8.如何合理的配置java線程池?如CPU密集型的任務或IO密集型的任務,基本線程池應該配置多大?

CPU密集型任務可以少配置線程數,大概和機器的cpu核心數相當,可以使得每個線程都在執行任務;IO密集型時,大部分線程都阻塞,故需要多配置線程數,2*cpu核心數

9.多讀少寫的情境應該使用哪個並發容器,為什麼使用它?

CopyOnWriteArrayList這個容器適用於多讀少寫。讀寫並不是在同一個對象上。在寫時會大面積複製數組,所以寫的效能差,在寫完成後將讀的引用改為執行寫的對象。

10.如何?樂觀鎖(CAS)?如何避免ABA問題?

1.CAS原語有三個值,一個是記憶體值,一個是期望值,一個是寫入值。 在不加鎖的情況下寫入時,每次讀取記憶體值,然後跟預期值比對,如果比對失敗,反覆的讀和比對,直到成功。在CAS原語是一個原子操作,如果寫入時,記憶體值發生改變,則寫入值失敗。

2.帶參數版本來避免aba問題,在讀取和替換的時候進行判定版本是否一致

11.什麼情境下可以使用volatile替換synchronized?

只需要保證共用資源的可見度的時候可以使用volatile替代,synchronized保證可操作的原子性一致性和可見度。 volatile適用於新值不依賴於就值的情形

12.什麼是可重新進入鎖(ReentrantLock)?

ReentrantLock 相對於固有鎖synchronized,同樣是可重新進入的,在某些vm版本上提供了比固有鎖更高的效能,提供了更豐富的鎖特性,比如可中斷的鎖,可等待的鎖,平等鎖以及非塊結構的加鎖。從代碼上盡量用固有鎖,vm會對固有鎖做一定的最佳化,並且代碼可維護和穩定。只有在需要ReentrantLock的一些特性時,可以考慮用ReentrantLock實現。

13.ReentrantLock 和synchronized比較。來自《java並發編程實戰》

1.為什麼JUC架構出現LOCK?

ReentrantLock並不是替代synchronized的方法,而是當內建鎖不適用時,作為一種可選的進階功能。

2.那麼Synchronized有哪些缺點?

①. 只有一個condition與鎖相關聯,這個condition是什嗎?就是synchronized對針對的對象鎖。

②. synchronized無法中斷一個正在等待獲得鎖的線程,也即多線程競爭一個鎖時,其餘未得到鎖的線程只能不停的嘗試獲得鎖,而不能中斷。這種情況對於大量的競爭線程會造成效能的下降等後果。

3.我們面對ReentrantLock和synchronized改如何選擇?

Synchronized相比Lock,為許多開發人員所熟悉,並且簡潔緊湊,如果現有程式已經使用了內建鎖,那麼盡量保持代碼風格統一,盡量不引入Lock,避免兩種機制混用,容易令人困惑,也容易發生錯誤。

在Synchronized無法滿足需求的情況下,Lock可以作為一種進階工具,這些功能包括“可定時的、可輪詢的與可中斷的鎖擷取操作,公平隊列,以及非塊結構的鎖”否則還是優先使用Synchronized。

最後,未來更可能提升Synchronized而不是Lock的效能,因為Synchronized是JVM的內建屬性,他能執行一些最佳化,例如對線程封閉的鎖對象的鎖消除最佳化,通過增加鎖的粒度來消除內建鎖的同步,而如果基於類庫的鎖來實現這些功能,則可能性不大。

14.volatile是否能保證數組中元素的可見度

volatile的數組只針對數組的引用具有volatile的語義,而不是它的元素

Java中並發問題整理

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.