通過實例解析synchronized和lock區(qū)別
1,原始構(gòu)成
synchronized是關鍵字,屬于JVM層面,通過wait,notify和notifyAll來調(diào)度線程。
Lock是具體類,是api層面的鎖。
2,使用方法
synchronized不需要用戶手動去釋放鎖, 當synchronized代碼執(zhí)行完后,系統(tǒng)會自動釋放鎖。
Lock需要用戶手動釋放鎖,否則會出現(xiàn)死鎖現(xiàn)象。需要lock和unlock配合try/finally語句塊來完成。
3,等待是否中斷
synchronized不可中斷,除非拋出異?;蛘哒_\行完畢。
Lock可中斷,可以設置超時方法或者調(diào)用中斷方法。
4,加鎖是否公平
synchronized非公平鎖。
Lock默認非公平鎖,可指定為公平鎖。
5,鎖綁定多個條件condition
synchronized沒有。
Lock用來分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronized一樣要么隨機喚醒一個線程,要么全部喚醒。
Demo: 練習
多線程之間按順序調(diào)用,實現(xiàn)A->B->C三個線程啟動,要求:AA打印5次,BB打印10次,CC打印15次,重復10遍。
package com.demo.lock; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; class ShareResource{ int number = 1; private Lock lock = new ReentrantLock(); private Condition c1 = lock.newCondition(); private Condition c2 = lock.newCondition(); private Condition c3 = lock.newCondition(); public void print5(){ lock.lock(); try { while(number!=1){ c1.await(); } for(int i=1;i<=5;i++){ System.out.println(Thread.currentThread().getName()+"\t"+i); } number = 2; c2.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void print10(){ lock.lock(); try { while(number!=2){ c2.await(); } for(int i=1;i<=10;i++){ System.out.println(Thread.currentThread().getName()+"\t"+i); } number = 3; c3.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } public void print15(){ lock.lock(); try { while(number!=3){ c3.await(); } for(int i=1;i<=15;i++){ System.out.println(Thread.currentThread().getName()+"\t"+i); } number = 1; c1.signal(); } catch (Exception e) { e.printStackTrace(); }finally{ lock.unlock(); } } } public class TestReentrantLock { public static void main(String[] args) { ShareResource shareResource = new ShareResource(); new Thread(()->{ for(int i=1;i<=10;i++){ shareResource.print5(); } },"AA").start(); new Thread(()->{ for(int i=1;i<=10;i++){ shareResource.print10(); } },"BB").start(); new Thread(()->{ for(int i=1;i<=10;i++){ shareResource.print15(); } },"CC").start(); } }
以上就是本文的全部內(nèi)容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。
- 深入Synchronized和java.util.concurrent.locks.Lock的區(qū)別詳解
- 詳談Lock與synchronized 的區(qū)別
- Java編程synchronized與lock的區(qū)別【推薦】
- 簡單了解synchronized和lock的區(qū)別
- 淺談Synchronized和Lock的區(qū)別
- Java 多線程Synchronized和Lock的區(qū)別
- 淺談Java中Lock和Synchronized的區(qū)別
- Java常用鎖synchronized和ReentrantLock的區(qū)別
- synchronized?和?Lock?的異同點(如何讓選擇)
相關文章
解析和解決org.springframework.beans.factory.NoSuchBeanDefinitionE
這篇文章主要介紹了解析和解決org.springframework.beans.factory.NoSuchBeanDefinitionException異常問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-04-04Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解
這篇文章主要為大家介紹了Guava自動加載緩存LoadingCache使用實戰(zhàn)詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-12-12Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼
這篇文章主要介紹了Apache Commons Math3探索之多項式曲線擬合實現(xiàn)代碼,小編覺得挺不錯的,這里分享給大家,供需要的朋友參考。2017-10-10Spring AI 使用本地 Ollama Embeddings的操作方法
使用 OpenAI 的 Embeddings 接口是有費用的,如果想對大量文檔進行測試,使用本地部署的 Embeddings 就能省去大量的費用,所以我們嘗試使用本地的 Ollama Embeddings,這篇文章主要介紹了Spring AI 使用本地 Ollama Embeddings,需要的朋友可以參考下2024-05-05