1.synchronized是一個關(guān)鍵字而lock是一個接口(lock、lockInterruptibly、tryLock、unlock、newCondition)。
2.synchronized是隱式的加鎖,lock是顯示的加鎖。
3.synchronized可以作用在方法和代碼塊上,而lock只能作用在代碼塊上。
synchronized作用在靜態(tài)方法上鎖的是當前類的class,作用在普通方法上鎖的是當前類的對象。
在javap反編譯成字節(jié)碼后,synchronized關(guān)鍵字需要有一個代碼塊進入的點monitorenter,代碼塊退出和代碼塊異常的出口點monitorexit。
4.synchronized是阻塞式加鎖,而lock中的trylock支持非阻塞式加鎖。
5.synchronized沒有超時機制,而lock中的trylcok可以支持超時機制。
6.synchronized不可中斷,而lock中的lockInterruptibly可中斷的獲取鎖。(ReentrantLock.lockInterruptibly允許在等待時由其它線程調(diào)用等待線程的Thread.interrupt方法來中斷等待線程的等待而直接返回,這時不用獲取鎖,而會拋出一個InterruptedException。 ReentrantLock.lock方法不允許Thread.interrupt中斷,即使檢測到Thread.isInterrupted,一樣會繼續(xù)嘗試獲取鎖,失敗則繼續(xù)休眠。只是在最后獲取鎖成功后再把當前線程置為interrupted狀態(tài),然后再中斷線程。)
7.synchronized采用的是monitor對象監(jiān)視器,lock的底層原理是AQS
8.synchronized只有一個同步隊列和一個等待隊列,而lock有一個同步隊列,可以有多個等待隊列。
同步隊列:排隊取鎖的線程所在的隊列。
等待隊列:調(diào)用 wait 方法后,線程會從同步隊列轉(zhuǎn)移到等待隊列。
9.synchronized是非公平鎖,而lock可以是公平鎖也可以是非公平鎖。
10.synchronized用object的notify方法進行喚醒,而lock用condition進行喚醒。
11.lock有ReadWriteLock支持并發(fā)讀。
Synchronized和Lock的區(qū)別
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
相關(guān)閱讀更多精彩內(nèi)容
- Synchronized 和Lock 的區(qū)別 Synchronized 是java 關(guān)鍵字,實現(xiàn)級別是JVM 級別...
- Synchronized 是Java 并發(fā)編程中很重要的關(guān)鍵字,可用在方法、代碼塊、對象上。 Lock 是 Jav...
- Synchronized和Lock的區(qū)別 并發(fā)編程中,鎖是經(jīng)常需要使用的。在開發(fā)中我們常用的鎖有兩種Synchro...
- 轉(zhuǎn)載自:https://blog.csdn.net/fly910905/article/details/79765...
- 從使用的角度看 synchronized 和 lock 的區(qū)別 起初 java 中只有 synchronized ...