Java核心技術及面試指南 多線程並發部分的面試題總結以及答案


7.2.10.1有T1、T2、T3三個線程,如何保證T2在T1執行完后執行,T3在T2執行完后執行?

    用join語句,在t3開始前join t2,在t2開始前join t1。

    不過,這會破壞多線程的並發性,不建議這樣做。

7.2.10.2 wait和sleep方法有什么不同?

    對於sleep()方法,我們首先要知道該方法是屬於Thread類中的。而wait()方法,則是屬於Object類中的。

    sleep()方法導致了程序暫停執行指定的時間,讓出cpu該其他線程,但是他的監控狀態依然保持者,當指定的時間到了又會自動恢復運行狀態。在調用sleep()方法的過程中,線程不會釋放對象鎖。

    而當調用wait()方法的時候,線程會放棄對象鎖,進入等待此對象的等待鎖定池,只有針對此對象調用notify()方法后本線程才獲取對象鎖進入運行狀態。

7.2.10.3 用Java多線程的思路解決生產者和消費者問題。

    在本書7.2.4部分里,給出了通過wait和notify解決生產者消費者問題的相關代碼,大家可以讀下。

7.2.10.4 如何在多個線程里共享資源。

    本書提到了synchronized,Lock和volatile三種方法,通過它們,可以控制多線程的並發,大家可以參考下。

7.2.10.5 notify和notifyAll方法有什么差別和聯系?

    通過wait和notify方法,我們同樣可以通過控制“鎖”的方式來實現多線程的並發管理。這兩個方法需要放置在synchronized的作用域里(比如synchronized作用的方法或代碼塊里),一旦一個線程執行wait方法后,該線程就會釋放synchronized所關聯的鎖,進入阻塞狀態,所以該線程一般無法再次主動地回到可執行狀態,一定要通過其它線程的notify(或notifyAll)方法喚醒它。

    一旦一個線程執行了notify方法,則會通知那些可能因調用wait方法而等待對象鎖的其他線程,如果有多個線程等待,則會任意挑選其中的一個線程來發出喚醒通知,這樣得到通知的線程就能繼續得到對象鎖從而繼續執行下去。

    對於notifyAll,該方法會讓所有因wait方法進入到阻塞狀態的線程退出阻塞狀態,但由於這些線程此時還沒有獲取到對象鎖,因此還不能繼續往下執行,它們會去競爭對象鎖,如果其中一個線程獲得了對象鎖,則會繼續執行,在它退出synchronized代碼釋放鎖后,其它的已經被喚醒的線程則會繼續競爭,以此類推,直到所有被喚醒的線程都執行完畢。

7.2.10.6 synchronized 和 ReentrantLock有什么不同?它們各自的適用場景是什么?

    synchronized可以作用在方法和代碼塊上,但無法鎖住由多個方法組成的業務塊,而ReentrantLock可以保證業務層面的並發。

7.2.10.7 synchronized如果作用在一段代碼上,那么是鎖什么?

    是鎖方法所在的對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM