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