Synchronized和Lock的區(qū)別:Synchronized編碼更簡單,鎖機制由JVM維護(hù),在競爭不激烈的情況下性能更好。Lock功能更強大更靈活,競爭激烈時性能較好。
- 性能不一樣:資源競爭激勵的情況下,lock性能會比synchronize好,競爭不激勵的情況下,synchronize比lock性能好,synchronize會根據(jù)鎖的競爭情況,從偏向鎖-->輕量級鎖-->重量級鎖升級,而且編程更簡單。
- 鎖機制不一樣:synchronize是在JVM層面實現(xiàn)的,系統(tǒng)會監(jiān)控鎖的釋放與否。lock是JDK代碼實現(xiàn)的,需要手動釋放,在finally塊中釋放??梢圆捎梅亲枞姆绞将@取鎖。
- Synchronized的編程更簡潔,lock的功能更多更靈活,缺點是一定要在finally里面 unlock()資源才行。
- 用法不一樣:synchronize可以用在代碼塊上,方法上。lock只能寫在代碼里,不能直接修改方法。
Lock支持的功能:
- 公平鎖:Synchronized是非公平鎖,Lock支持公平鎖,默認(rèn)非公平鎖
- 可中斷鎖:ReentrantLock提供了lockInterruptibly()的功能,可以中斷爭奪鎖的操作,搶鎖的時候會check是否被中斷,中斷直接拋出異常,退出搶鎖。而Synchronized只有搶鎖的過程,不可干預(yù),直到搶到鎖以后,才可以編碼控制鎖的釋放。
- 快速反饋鎖:ReentrantLock提供了trylock() 和 trylock(tryTimes)的功能,不等待或者限定時間等待獲取鎖,更靈活??梢员苊馑梨i的發(fā)生。
- 讀寫鎖:ReentrantReadWriteLock類實現(xiàn)了讀寫鎖的功能,類似于Mysql,鎖自身維護(hù)一個計數(shù)器,讀鎖可以并發(fā)的獲取,寫鎖只能獨占。而synchronized全是獨占鎖
- Condition:ReentrantLock提供了比Sync更精準(zhǔn)的線程調(diào)度工具,Condition,一個lock可以有多個Condition,比如在生產(chǎn)消費的業(yè)務(wù)下,一個鎖通過控制生產(chǎn)Condition和消費Condition精準(zhǔn)控制。