lock()與lockInterruptibly()的區別


lock 與 lockInterruptibly比較區別在於:
lock 優先考慮獲取鎖,待獲取鎖成功后,才響應中斷。
lockInterruptibly 優先考慮響應中斷,而不是響應鎖的普通獲取或重入獲取。

詳細區別:

ReentrantLock.lockInterruptibly允許在等待時由其它線程調用等待線程的Thread.interrupt方法來中斷等待線程的等待而直接返回,這時不用獲取鎖,而會拋出一個InterruptedException。 ReentrantLock.lock方法不允許Thread.interrupt中斷,即使檢測到Thread.isInterrupted,一樣會繼續嘗試獲取鎖,失敗則繼續休眠。只是在最后獲取鎖成功后再把當前線程置為interrupted狀態,然后再中斷線程。

看一下測試代碼如下:

  1. class MyThread05 extends Thread{
  2. public void test3() throws Exception{
  3. final Lock lock = new ReentrantLock();
  4. lock.lock();
  5. Thread.sleep( 1000);
  6. Thread t1 = new Thread(new Runnable(){
  7. @Override
  8. public void run() {
  9. lock.lock();
  10. // try {
  11. // lock.lockInterruptibly();
  12. // } catch (InterruptedException e) {
  13. // // TODO Auto-generated catch block
  14. // e.printStackTrace();
  15. // }
  16. System.out.println(Thread.currentThread().getName()+ " interrupted.");
  17. }
  18. });
  19. t1.start();
  20. Thread.sleep( 1000);
  21. t1.interrupt();
  22. Thread.sleep( 1000000);
  23. }
  24. }

這里使用的是lock()方法,在主程序中執行test3()方法后回發現,即使執行了interrupt()方法也沒有反應。

將注釋代碼取消掉,我們會發現,程序要求捕捉該異常


免責聲明!

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



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