對于Lock與synchronized的差別
1、Lock能夠完成synchronized所實作的所有功能,并且提供了多樣化的同步,比如有時間限制的同步,可以被Interrupt的同步(synchronized的同步是不能Interrupt的)等。
- 如果使用 synchronized ,如果A不釋放,B将一直等下去,不能被中斷。
- 如果使用ReentrantLock,如果A不釋放,可以使B在等待了足夠長的時間以後,中斷等待,而幹别的事情。
2、synchronized是在JVM層面上實作的,不但可以通過一些監控工具監控synchronized的鎖定,而且在代碼執行時出現異常,JVM會自動釋放鎖定。但Lock不能,隻能手動釋放,并且在finally從句中unLock()釋放。
3、性能:
在jdk1.5中Synchronized是使用的獨占悲觀鎖,資源競争不激烈的情況下synchronized性能略高,資源競争激烈 的情況下性能要遠低于Lock。jdk1.6以後synchronized和lock一樣都是使用CAS樂觀鎖操作,是以性能差不多,對于具體使用哪一個 要看具體的系統應用需要,Synchronized相對簡單易用,若需要精細的靈活控制則可以考慮選擇lock。
- void lock(); ---擷取鎖。執行此方法時,如果鎖處于空閑狀态,目前線程将擷取到鎖。相反,如果鎖已經被其他線程持有,将禁用目前線程并處于休眠狀态,直到目前線程擷取到鎖。
- void unlock(); ----執行此方法時,目前線程将釋放持有的鎖。鎖隻能由持有者釋放,如果線程并不持有鎖,卻執行該方法,可能導緻異常的發生。
- boolean tryLock(); ----如果鎖可用, 則擷取鎖, 并立即傳回true, 否則傳回false. 該方法和lock()的 差別在于, tryLock()隻是"試圖"擷取鎖, 如果鎖不可用, 不會導緻目前線程被禁用,目前線程仍然繼續往下執行代碼. 而lock()方法則是一定要擷取到鎖, 如果鎖不可用, 就一直等待, 在未獲得鎖之前,目前線程并不繼續向下執行. 通常采用如下的代碼形式調用tryLock()方法:
- void lockInterruptibly() throws InterruptedException; ----如果目前線程未被中斷且可用,則擷取鎖并立即傳回。 如果鎖不可用,将禁用目前線程,并且在發生以下兩種情況之一以前,該線程将一直處于休眠狀态:
Ø 鎖由目前線程獲得;或者