lock和synchronized到底啥區(qū)別?
來源傳智教育2022年03月17日 11時(shí)13分09秒
lock和synchronized區(qū)別主要體現(xiàn)在5個(gè)方面:
1.語法層面
* synchronized 是關(guān)鍵字,源碼在 jvm 中,用 c++ 語言實(shí)現(xiàn)
* Lock 是接口,源碼由 jdk 提供,用 java 語言實(shí)現(xiàn)
* 使用 synchronized 時(shí),退出同步代碼塊鎖會(huì)自動(dòng)釋放,而使用 Lock 時(shí),需要手動(dòng)調(diào)用 unlock 方法釋放鎖
2.功能層面
* 二者均屬于悲觀鎖、都具備基本的互斥、同步、鎖重入功能
* Lock 提供了許多 synchronized 不具備的功能,例如獲取等待狀態(tài)、公平鎖、可打斷、可超時(shí)、多條件變量
* Lock 有適合不同場(chǎng)景的實(shí)現(xiàn),如 ReentrantLock, ReentrantReadWriteLock
3.性能層面
* 在沒有競(jìng)爭(zhēng)時(shí),synchronized 做了很多優(yōu)化,如偏向鎖、輕量級(jí)鎖,性能不賴
* 在競(jìng)爭(zhēng)激烈時(shí),Lock 的實(shí)現(xiàn)通常會(huì)提供更好的性能
4.公平鎖
公平鎖的公平體現(xiàn)
已經(jīng)處在阻塞隊(duì)列**中的線程(不考慮超時(shí))始終都是公平的,先進(jìn)先出
公平鎖是指**未處于阻塞隊(duì)列**中的線程來爭(zhēng)搶鎖,如果隊(duì)列不為空,則老實(shí)到隊(duì)尾等待
非公平鎖是指**未處于阻塞隊(duì)列**中的線程來爭(zhēng)搶鎖,與隊(duì)列頭喚醒的線程去競(jìng)爭(zhēng),誰搶到算誰的
公平鎖會(huì)降低吞吐量,一般不用
5.條件變量
* ReentrantLock 中的條件變量功能類似于普通 synchronized 的 wait,notify,用在當(dāng)線程獲得鎖后,發(fā)現(xiàn)條件不滿足時(shí),臨時(shí)等待的鏈表結(jié)構(gòu)
* 與 synchronized 的等待集合不同之處在于,ReentrantLock 中的條件變量可以有多個(gè),可以實(shí)現(xiàn)更精細(xì)的等待、喚醒控制。
最新問答
- 2022年06月30日黑盒測(cè)試與白盒測(cè)試的區(qū)別是啥?
- 2022年06月30日Hive的安裝模式有幾種?
- 2022年06月29日Flume系統(tǒng)要求是什么?
- 2022年06月29日數(shù)據(jù)發(fā)布與訂閱有哪些主要應(yīng)用場(chǎng)景?
- 2022年06月29日Zookeeper集群角色有哪三種?
- 2022年06月29日hadoop1.x和hadoop2.x的區(qū)別是什么,做了哪些改進(jìn)?
- 2022年06月28日znode有哪兩種節(jié)點(diǎn)?
- 2022年06月28日非全新集群選舉的過程是什么樣的?
- 2022年06月28日applicationmaster是什么?
- 2022年06月28日yarn的工作流程是什么?
相關(guān)問答
- 2022年03月25日Math類的常用方法有哪些?
- 2022年03月22日Java中的封裝是個(gè)啥?
- 2022年03月17日Java培訓(xùn)線上線下有什么區(qū)別么?
- 2022年03月17日List接口是啥??有大神知道嗎?
- 2022年03月17日想在Java中聲明和定義接口怎么實(shí)現(xiàn)?
- 2022年03月17日求教:Random怎么在Java中構(gòu)建產(chǎn)生隨機(jī)數(shù)?
- 2022年03月11日java自學(xué)成功率
- 2022年03月11日java工程師工資一般多少
- 2022年03月11日java培訓(xùn)哪家教育機(jī)構(gòu)比較好
- 2022年03月11日java難學(xué)嗎