1、與synchronized相比ReentrantLock擁有非阻塞的獲取鎖、響應(yīng)中斷、超時機(jī)制、支持公平性設(shè)置等特性,這些特性是在這兩種鎖進(jìn)行選擇時的依據(jù),而不是性能,JDK6之后內(nèi)置鎖引入了基于CAS的偏向鎖、輕量級鎖,以及JVM中的鎖消除、鎖粗化等優(yōu)化手段,synchronized的性能不再是詬病。
2、ReentrantLock也會出現(xiàn)死鎖,出現(xiàn)死鎖的原因大都在于鎖未釋放,所以unlock一定要放在 finally中。
3、不管哪一種鎖都會帶來一定的性能損耗,使用鎖時要盡量減少持有鎖的時間,即避免在臨界區(qū)內(nèi)進(jìn)行耗時計算。
3.1:盡量減少鎖的作用域范圍,即臨界區(qū)內(nèi)的代碼越短越好(lock...unlock之間)。
3.2:能使用共享鎖時盡量避免使用獨占鎖,如ReadWriteLock就比ReentrantLock的吞吐量高。
3.3:必要時進(jìn)行分拆鎖和分離鎖,如ConcurrentHashMap的實現(xiàn)中,內(nèi)部的數(shù)組被分成16段,每段單獨加鎖,使得每把鎖的請求時間縮短,能支持更高的吞吐量,最好的情況下可以支持16個線程同時寫入。
碼字不易,轉(zhuǎn)載請保留原文連接http://www.lxweimin.com/p/be9298b272e7