java鎖的常見面試題


Lock鎖和synchronized鎖的區別

  1. Lock鎖是對象,而synchronized是java關鍵字
  2. Lock鎖需要手動加鎖釋放鎖,synchronized的該操作是全自動的。對於異常前者需要手動釋放鎖,不然容易導致死鎖。而后者由jvm自動管理。
  3. Lock鎖的屬性可以配置,而synchronized只能是可重入的、非公平的、不可中斷的。
  4. 在實現原理上synchronized主要是基於對象的monitor。而Lock的實現是java層面的,基礎是AQS

wait和sleep的區別

  1. wait是Object類的方法,sleep是Thread類的靜態方法。也就是說前者任何對象都可以調用。
  2. wait會釋放鎖,而sleep不釋放鎖。也可以理解為sleep方法只是釋放cpu時間片,而沒有釋放同步資源。當線程休眠完指定時間后,會自動重新去競爭時間片進行執行。而wait則需要其他線程調用notify、notifyAll來喚醒。
  3. sleep可以使用在任何地方,而wait只能用到同步代碼塊和方法中。
  4. wait方法是native方法,底層是用C寫的。因此相對於yield、wait方法具有釋放共享資源的能力。而join能夠釋放資源使用為其內部調用了wait方法。

Object類中線程間協作函數

  • wait()
    該方法用來將當前線程置入休眠狀態,直到接到通知或被中斷為止。在調用 wait()之前,線程必須要獲得該對象的對象級別鎖,即只能在同步方法或同步塊中調用 wait()方法。進入 wait()方法后,當前線程釋放鎖。在從 wait()返回前,線程與其他線程競爭重新獲得鎖。如果調用 wait()時,沒有持有適當的鎖,則拋出 IllegalMonitorStateException,它是 RuntimeException 的一個子類,因此,不需要 try-catch 結構。

  • notify()
    該方法也要在同步方法或同步塊中調用,即在調用前,線程也必須要獲得該對象的對象級別鎖,的如果調用 notify()時沒有持有適當的鎖,也會拋出 IllegalMonitorStateException。
    該方法用來通知那些可能等待該對象的對象鎖的其他線程。如果有多個線程等待,則線程規划器任意挑選出其中一個 wait()狀態的線程來發出通知,並使它等待獲取該對象的對象鎖(notify 后,當前線程不會馬上釋放該對象鎖,wait 所在的線程並不能馬上獲取該對象鎖,要等到程序退出 synchronized 代碼塊后,當前線程才會釋放鎖,wait所在的線程也才可以獲取該對象鎖),但不驚動其他同樣在等待被該對象notify的線程們。當第一個獲得了該對象鎖的 wait 線程運行完畢以后,它會釋放掉該對象鎖,此時如果該對象沒有再次使用 notify 語句,則即便該對象已經空閑,其他 wait 狀態等待的線程由於沒有得到該對象的通知,會繼續阻塞在 wait 狀態,直到這個對象發出一個 notify 或 notifyAll。這里需要注意:它們等待的是被 notify 或 notifyAll,而不是鎖。這與下面的 notifyAll()方法執行后的情況不同。

  • notifyAll()
    該方法與 notify ()方法的工作方式相同,重要的一點差異是:
    notifyAll 使所有原來在該對象上 wait 的線程統統退出 wait 的狀態(即全部被喚醒,不再等待 notify 或 notifyAll,但由於此時還沒有獲取到該對象鎖,因此還不能繼續往下執行),變成等待獲取該對象上的鎖,一旦該對象鎖被釋放(notifyAll 線程退出調用了 notifyAll 的 synchronized 代碼塊的時候),他們就會去競爭。如果其中一個線程獲得了該對象鎖,它就會繼續往下執行,在它退出 synchronized 代碼塊,釋放鎖后,其他的已經被喚醒的線程將會繼續競爭獲取該鎖,一直進行下去,直到所有被喚醒的線程都執行完畢。

  • 總結
    如果線程調用了對象的 wait()方法,那么線程便會處於該對象的等待池中,等待池中的線程不會去競爭該對象的鎖。
    當有線程調用了對象的 notifyAll()方法(喚醒所有 wait 線程)或 notify()方法(只隨機喚醒一個 wait 線程),被喚醒的的線程便會進入該對象的鎖池中,鎖池中的線程會去競爭該對象鎖。
    優先級高的線程競爭到對象鎖的概率大,假若某線程沒有競爭到該對象鎖,它還會留在鎖池中,唯有線程再次調用 wait()方法,它才會重新回到等待池中。而競爭到對象鎖的線程則繼續往下執行,直到執行完了 synchronized 代碼塊,它會釋放掉該對象鎖,這時鎖池中的線程會繼續競爭該對象鎖。


免責聲明!

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



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