該部分為一些零散的面試理論知識點:
1、concurrenthashmap的併發度是什麼
concurrenthashmap的併發度就是segment的大小,預設為16,這意味著最多同時可以有16條執行緒操作concurrenthashmap,這也是concurrenthashmap對hashtable的最大優勢
2、readwritelock
首先明確一下,不是說reentrantlock不好,只是reentrantlock某些時候有侷限。如果使用reentrantlock,可能本身是為了防止執行緒a在寫資料、執行緒b在讀資料造成的資料不一致,但這樣,如果執行緒c在讀資料、執行緒d也在讀資料,讀資料是不會改變資料的,沒有必要加鎖,但是還是加鎖了,降低了程式的效能。因為這個,才誕生了讀寫鎖readwritelock。readwritelock是乙個讀寫鎖介面,reentrantreadwritelock是readwritelock介面的乙個具體實現,實現了讀寫的分離, 讀鎖是共享的,寫鎖是獨佔的 ,讀和讀之間不會互斥,讀和寫、寫和讀、寫和寫之間才會互斥,提公升了讀寫的效能。
3、futuretask
這個其實前面有提到過,futuretask表示乙個非同步運算的任務。futuretask裡面可以傳入乙個callable的具體實現類,可以對這個非同步運算的任務的結果進行等待獲取、判斷是否已經完成、取消任務等操作。當然,由於futuretask也是runnable介面的實現類,所以futuretask也可以放入執行緒池中。
4、thread.sleep(0)的作用是什麼
由於j**a採用搶占式的執行緒排程演算法,因此可能會出現某條執行緒常常獲取到cpu控制權的情況,為了讓某些優先順序比較低的執行緒也能獲取到cpu控制權,可以使用thread.sleep(0)手動觸發一次作業系統分配時間片的操作,這也是平衡cpu控制權的一種操作。
5、hashtable的size()方法為什麼要做同步
這是乙個非常刁鑽和狡猾的問題。請記住:執行緒類的構造方法、靜態塊是被new這個執行緒類所在的執行緒所呼叫的,而run方法裡面的**才是被執行緒自身所呼叫的。如果說上面的說法讓你感到困惑,那麼我舉個例子, 假設thread2中new了thread1,main函式中new了thread2,那麼:
1)thread2的構造方法、靜態塊是main執行緒呼叫的,thread2的run()方法是thread2自己呼叫的
2)thread1的構造方法、靜態塊是thread2呼叫的,thread1的run()方法是thread1自己呼叫的
7、如何選擇同步方法和同步塊
1)高併發、任務執行時間短的業務,執行緒池執行緒數可以設定為cpu核數+1,減少執行緒上下文的切換
2)併發不高、任務執行時間長的業務要區分開看:
a)假如是業務時間長集中在io操作上,也就是io密集型的任務,因為io操作並不占用cpu,所以不要讓所有的cpu閒下來,可以加大執行緒池中的執行緒數目,讓cpu處理更多的業務
b)假如是業務時間長集中在計算操作上,也就是計算密集型任務,這個就沒辦法了,和(1)一樣吧,執行緒池中的執行緒數設定得少一些,減少執行緒上下文的切換
3)併發高、業務執行時間長,解決這種型別任務的關鍵不在於執行緒池而在於整體架構的設計,看看這些業務裡面某些資料是否能做快取是第一步,增加伺服器是第二步,至於執行緒池的設定,設定參考(2)。最後,業務執行時間長的問題,也可能需要分析一下,看看能不能使用中介軟體對任務進行拆分和解耦
9、如何解決多執行緒之間執行緒安全問題
使用多執行緒之間同步synchronized或使用鎖(lock)。
解釋:執行緒安全性包括兩個方面:
1)可見性
2)原子性 僅僅使用volatile,能保證的執行緒的原子性但是並不能保證執行緒安全性。而synchronized則可實現執行緒的安全性。
10、如何檢測乙個執行緒是否持有物件監視器
thread類提供了乙個holdslock(object obj)方法,當且僅當物件obj的監視器被某條執行緒持有的時候才會返回true,注意這是乙個static方法,這意味著 「某條執行緒」指的是當前執行緒
11、如何喚醒乙個阻塞的執行緒
如果執行緒是因為呼叫了wait()、sleep()或者join()方法而導致的阻塞,可以中斷執行緒,並且通過丟擲interruptedexception來喚醒它;
如果執行緒遇到了io阻塞,無能為力,因為io是作業系統實現的,j**a**並沒有辦法直接接觸到作業系統。
上述知識點是我在園友一篇關於多執行緒的面試題上看到的,當時做了記錄但是沒儲存連線。望諒解!更多多執行緒基礎知識,可檢視多執行緒分類中的內容
java併發 多執行緒知識點總結
1 web庫類 sevlet天生有多執行緒性。2 定義任務 使用runnable介面並實現run 方法。而將runnable 不返回任何值 物件程式設計工作任務的方式為 thread t new thread new task t.start 這裡start 會迅速返回,因為每個任務都由不同的執行緒...
多執行緒 知識點總結二
1.sleep 和wait 方法的區別?sleep 必須指時間 不釋放鎖。wait 可以不指定時間,也可以指定時間 釋放鎖。2.為什麼wait notify notifyall 等方法都定義在object類中?wait 等待,notify 喚醒單個執行緒,notifyall 喚醒所有的執行緒 這些方...
多執行緒之知識點
多執行緒的學習 1.都不是原子操作,在多執行緒中值可能被改變 因此在多執行緒環境中對乙個變數進行讀寫時,我們需要有一種方法能夠保證對乙個值的遞增操作是原子操作 即不可打斷性,乙個執行緒在執行原子操作時,其它執行緒必須等待它完成之後才能開始執行該原子操作。這種涉及到硬體的操作會不會很複雜了,幸運的是,...