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