您好,登錄后才能下訂單哦!
這篇文章主要介紹“JUC中的Lock鎖與synchronized同步代碼塊問題怎么解決”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“JUC中的Lock鎖與synchronized同步代碼塊問題怎么解決”文章能幫助大家解決問題。
ReentrantLock
類: 可重用鎖(公平鎖|非公平鎖)
ReentrantReadWriteLock.ReadLock
:讀鎖
ReentrantReadWriteLock.WriteLock
:寫鎖
鎖的底層有公平鎖和非公平鎖。其中:
公平鎖 :十分公平,不能插隊。
非公平鎖 :十分不公平,可以插隊。(默認非公平鎖)
/** * synchronized 同步代碼塊保證售票線程安全 * * @Author JUNSHI * @Create 2022-04-10 22:46 */ public class SaleTicketDemo01 { public static void main(String[] args) { Ticket ticket = new Ticket(); new Thread(()->{ for (int i = 0; i < 60; i++) { ticket.sale(); } },"AA").start(); },"BB").start(); new Thread(() -> { }, "CC").start(); } static class Ticket{ // 50張飄票 private int num = 50; // 售票 synchronized(同步代碼塊) 本質: 隊列,鎖 public synchronized void sale(){ if (num > 0){ System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num); } }
/** * Lock 加鎖保證售票線程安全 * * @Author JUNSHI * @Create 2022-04-10 22:46 */ public class SaleTicketDemo02 { public static void main(String[] args) { Ticket2 ticket = new Ticket2(); new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"AA").start(); new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"BB").start(); new Thread(()->{ for (int i = 0; i < 60; i++) ticket.sale(); },"CC").start(); } static class Ticket2{ // 50張飄票 private int num = 50; // 加鎖三部曲 // 1、 創建鎖 => new ReentrantLock(); // 2、 加鎖 => lock.lock(); // 3、 釋放鎖 => lock.unlock(); public void sale(){ // 可重入鎖 默認:非公平鎖:十分不公平,可以插隊。(默認非公平鎖) Lock lock = new ReentrantLock(); // 加鎖 lock.lock(); try { // 執行業務 if (num > 0){ System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num); } } catch (Exception e) { e.printStackTrace(); } finally { // 解鎖 lock.unlock(); } } } }
snchronized
是內置Java關鍵字;Lock
是一個Java類。
synchronized
無法判斷獲取鎖的狀態;Lock
可以判斷是否獲取到了鎖。(boolean b = lock.tryLock();)
synchronized
會自動釋放鎖;Lock
必須要手動釋放鎖,如果不釋放鎖,死鎖。
synchronized
線程1獲得鎖阻塞時,線程2會一直等待下去;Lock鎖線程1獲得鎖阻塞時,線程2等待足夠長的時間后中斷等待,去做其他的事。
synchronized
可重入鎖:不可以中斷的,非公平;Lock可重入鎖:可以判斷鎖,非公平(可以自己設置)。
lock.lockInterruptibly()
;方法:當兩個線程同時通過該方法想獲取某個鎖時,假若此時線程A獲取到了鎖,而線程B只有在等待,那么對線程B調用threadB.interrupt()
方法能夠中斷線程B的等待過程。
synchronized
適合鎖少量的代碼同步問題; Lock適合鎖大量的同步代碼。
關于“JUC中的Lock鎖與synchronized同步代碼塊問題怎么解決”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識,可以關注億速云行業資訊頻道,小編每天都會為大家更新不同的知識點。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。