您好,登錄后才能下訂單哦!
這篇文章主要介紹“JUC中的Lock鎖與synchronized同步代碼塊問題怎么解決”的相關(guān)知識(shí),小編通過實(shí)際案例向大家展示操作過程,操作方法簡單快捷,實(shí)用性強(qiáng),希望這篇“JUC中的Lock鎖與synchronized同步代碼塊問題怎么解決”文章能幫助大家解決問題。
ReentrantLock
類: 可重用鎖(公平鎖|非公平鎖)
ReentrantReadWriteLock.ReadLock
:讀鎖
ReentrantReadWriteLock.WriteLock
:寫鎖
鎖的底層有公平鎖和非公平鎖。其中:
公平鎖 :十分公平,不能插隊(duì)。
非公平鎖 :十分不公平,可以插隊(duì)。(默認(rèn)非公平鎖)
/** * 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(同步代碼塊) 本質(zhì): 隊(duì)列,鎖 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、 創(chuàng)建鎖 => new ReentrantLock(); // 2、 加鎖 => lock.lock(); // 3、 釋放鎖 => lock.unlock(); public void sale(){ // 可重入鎖 默認(rèn):非公平鎖:十分不公平,可以插隊(duì)。(默認(rèn)非公平鎖) Lock lock = new ReentrantLock(); // 加鎖 lock.lock(); try { // 執(zhí)行業(yè)務(wù) if (num > 0){ System.out.println(Thread.currentThread().getName()+"賣出了"+(num--)+"票,剩余:"+num); } } catch (Exception e) { e.printStackTrace(); } finally { // 解鎖 lock.unlock(); } } } }
snchronized
是內(nèi)置Java關(guān)鍵字;Lock
是一個(gè)Java類。
synchronized
無法判斷獲取鎖的狀態(tài);Lock
可以判斷是否獲取到了鎖。(boolean b = lock.tryLock();)
synchronized
會(huì)自動(dòng)釋放鎖;Lock
必須要手動(dòng)釋放鎖,如果不釋放鎖,死鎖。
synchronized
線程1獲得鎖阻塞時(shí),線程2會(huì)一直等待下去;Lock鎖線程1獲得鎖阻塞時(shí),線程2等待足夠長的時(shí)間后中斷等待,去做其他的事。
synchronized
可重入鎖:不可以中斷的,非公平;Lock可重入鎖:可以判斷鎖,非公平(可以自己設(shè)置)。
lock.lockInterruptibly()
;方法:當(dāng)兩個(gè)線程同時(shí)通過該方法想獲取某個(gè)鎖時(shí),假若此時(shí)線程A獲取到了鎖,而線程B只有在等待,那么對線程B調(diào)用threadB.interrupt()
方法能夠中斷線程B的等待過程。
synchronized
適合鎖少量的代碼同步問題; Lock適合鎖大量的同步代碼。
關(guān)于“JUC中的Lock鎖與synchronized同步代碼塊問題怎么解決”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。