您好,登錄后才能下訂單哦!
synchronized與lock的區別有哪些?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
1,原始構成
synchronized是關鍵字,屬于JVM層面,通過wait,notify和notifyAll來調度線程。
Lock是具體類,是api層面的鎖。
2,使用方法
synchronized不需要用戶手動去釋放鎖, 當synchronized代碼執行完后,系統會自動釋放鎖。
Lock需要用戶手動釋放鎖,否則會出現死鎖現象。需要lock和unlock配合try/finally語句塊來完成。
3,等待是否中斷
synchronized不可中斷,除非拋出異常或者正常運行完畢。
Lock可中斷,可以設置超時方法或者調用中斷方法。
4,加鎖是否公平
synchronized非公平鎖。
Lock默認非公平鎖,可指定為公平鎖。
5,鎖綁定多個條件condition
synchronized沒有。
Lock用來分組喚醒需要喚醒的線程,可以精確喚醒,而不是像synchronized一樣要么隨機喚醒一個線程,要么全部喚醒。
Demo: 練習
多線程之間按順序調用,實現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(); } }
看完上述內容,你們掌握synchronized與lock的區別有哪些的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。