標籤: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中並發問題整理