Java Lock鎖多線程中實(shí)現(xiàn)流水線任務(wù)
下面程序代碼通過(guò)使用Lock鎖執(zhí)行簡(jiǎn)單的流水線任務(wù):
import java.util.concurrent.locks.Condition; import java.util.concurrent.locks.Lock; import java.util.concurrent.locks.ReentrantLock; /** * @author lzq * @data 2020/4/29 0029 - 下午 9:48 */ public class TestLock { public static void main(String[] args) { DataSource dataSource=new DataSource(); new Thread(() -> { for (int i=0;i<10;i++){ dataSource.a(); } },"A").start(); new Thread(() -> { for (int i=0;i<10;i++){ dataSource.b(); } },"B").start(); new Thread(() -> { for (int i=0;i<10;i++){ dataSource.c(); } },"C").start(); } } class DataSource{ private int x=1; private Lock lock=new ReentrantLock(); private Condition condition1=lock.newCondition(); private Condition condition2=lock.newCondition(); private Condition condition3=lock.newCondition(); public void a(){ lock.lock(); try { while(x!=1){ condition1.await(); } System.out.println(Thread.currentThread().getName()+":aaa"); x=2; condition2.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void b(){ lock.lock(); try { while(x!=2){ condition2.await(); } System.out.println(Thread.currentThread().getName()+":bbb"); x=3; condition3.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } public void c(){ lock.lock(); try { while(x!=3){ condition3.await(); } System.out.println(Thread.currentThread().getName()+":ccc"); x=1; condition1.signal(); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); } } }
執(zhí)行結(jié)果如下:
對(duì)于上面代碼簡(jiǎn)單分析:代碼中包含簡(jiǎn)單的生產(chǎn)者消費(fèi)者流程和Lock實(shí)現(xiàn)三部曲,即重復(fù)判斷條件,執(zhí)行邏輯,喚醒其他線程和產(chǎn)生鎖,加鎖,解鎖。注意這里一點(diǎn),條件判斷一定要重復(fù)判斷,不然可能會(huì)導(dǎo)致線程假醒影響結(jié)果。
因?yàn)楫?dāng)線程處于等待狀態(tài)時(shí),線程會(huì)釋放資源,等到被喚醒的時(shí)候,從上次await的地方醒來(lái)繼續(xù)執(zhí)行,這時(shí)條件判斷成立,執(zhí)行await,其他線程再修改條件使得本線程被喚醒,此時(shí)本線程不會(huì)繼續(xù)判斷,而是繼續(xù)執(zhí)行,如果使用循環(huán)判斷就能檢驗(yàn)出條件被修改。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
- Java多線程中Lock鎖的使用總結(jié)
- Java多線程鎖機(jī)制相關(guān)原理實(shí)例解析
- Java Lambda表達(dá)式原理及多線程實(shí)現(xiàn)
- Java多線程并發(fā)執(zhí)行demo代碼實(shí)例
- 深入分析JAVA 多線程--interrupt()和線程終止方式
- 淺談Java獲得多線程的返回結(jié)果方式(3種)
- Java多線程及線程安全實(shí)現(xiàn)方法解析
- 實(shí)例代碼講解JAVA多線程
- 詳解Java Callable接口實(shí)現(xiàn)多線程的方式
- Java多線程Callable和Future接口區(qū)別
- Java多線程通信wait()和notify()代碼實(shí)例
- Java實(shí)現(xiàn)多線程同步五種方法詳解
- Java多線程生產(chǎn)者消費(fèi)者模式實(shí)現(xiàn)過(guò)程解析
- 基于Java實(shí)現(xiàn)多線程下載并允許斷點(diǎn)續(xù)傳
- Java中的多線程一定就快嗎?
相關(guān)文章
Java的非對(duì)稱(chēng)加密(RSA、數(shù)字簽名、數(shù)字證書(shū))詳解
這篇文章主要介紹了Java的非對(duì)稱(chēng)加密(RSA、數(shù)字簽名、數(shù)字證書(shū))詳解,非對(duì)稱(chēng)加密:加密、解密使用不同的兩把密鑰,這兩把密鑰成對(duì),一般通信開(kāi)始時(shí)通過(guò)非對(duì)稱(chēng)加密將對(duì)稱(chēng)加密的密鑰發(fā)送給另一方,然后雙方通過(guò)對(duì)稱(chēng)加密來(lái)進(jìn)行溝通,需要的朋友可以參考下2024-01-01SpringBoot參數(shù)校驗(yàn)的方法總結(jié)
今天帶大家學(xué)習(xí)SpringBoot參數(shù)校驗(yàn)的方法,文中有非常詳細(xì)的代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05springboot2.X整合prometheus監(jiān)控的實(shí)例講解
這篇文章主要介紹了springboot2.X整合prometheus監(jiān)控的實(shí)例講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2021-03-03Java定時(shí)任務(wù):利用java Timer類(lèi)實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的功能
本篇文章主要介紹了利用java Timer類(lèi)實(shí)現(xiàn)定時(shí)執(zhí)行任務(wù)的功能,具有一定的參考價(jià)值,有需要的可以了解一下。2016-11-11