互斥鎖和信號量都是操作系統(tǒng)中為并發(fā)編程設(shè)計基本概念,互斥鎖和信號量的概念上的不同在于,對于同一個資源,互斥鎖只有0和1 的概念,而信號量不止于此。也就是說,信號量可以使資源同時被多個線程訪問,而互斥鎖同時只能被一個線程訪問
互斥鎖在java中的實(shí)現(xiàn)就是 ReetranLock , 在訪問一個同步資源時,它的對象需要通過方法 tryLock() 獲得這個鎖,如果失敗,返回 false,成功返回true。根據(jù)返回的信息來判斷是否要訪問這個被同步的資源。看下面的例子
創(chuàng)新互聯(lián)是一家集網(wǎng)站建設(shè),延吉企業(yè)網(wǎng)站建設(shè),延吉品牌網(wǎng)站建設(shè),網(wǎng)站定制,延吉網(wǎng)站建設(shè)報價,網(wǎng)絡(luò)營銷,網(wǎng)絡(luò)優(yōu)化,延吉網(wǎng)站推廣為一體的創(chuàng)新建站企業(yè),幫助傳統(tǒng)企業(yè)提升企業(yè)形象加強(qiáng)企業(yè)競爭力。可充分滿足這一群體相比中小企業(yè)更為豐富、高端、多元的互聯(lián)網(wǎng)需求。同時我們時刻保持專業(yè)、時尚、前沿,時刻以成就客戶成長自我,堅(jiān)持不斷學(xué)習(xí)、思考、沉淀、凈化自己,讓我們?yōu)楦嗟钠髽I(yè)打造出實(shí)用型網(wǎng)站。
public class ReentranLockExample { private static int count = 0; private static ReentrantLock reentrantLock = new ReentrantLock(); static class MyThread extends Thread{ @Override public void run() { super.run(); try { while (true){ boolean result = reentrantLock.tryLock(); if (result){ System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count ++); reentrantLock.unlock(); }else{ System.out.println(Thread.currentThread().getName() + "get the lock failed and run the syn code " + count); } System.out.println(Thread.currentThread().getName() + "run the asyntronized code " + count); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); thread1.start(); thread2.start(); } }
信號量相當(dāng)于一個計數(shù)器,如果線程想要訪問某個資源,則先要獲得這個資源的信號量,并且信號量內(nèi)部的計數(shù)器減1 ,信號量內(nèi)部的計數(shù)器大于0則意味著有可以使用的資源,當(dāng)線程使用完某個資源時,必須釋放這個資源的信號量。信號量的一個作用就是可以實(shí)現(xiàn)指定個線程去同事訪問某個資源。只需要在初始化 。
信號量在 Java中的實(shí)現(xiàn)是 Semaphore ,其在初始化時傳入一個整型數(shù), 用來指定同步資源最大的并發(fā)訪問量
public class SemaphoreExample { private static Semaphore semaphore = new Semaphore(2); private String lock = "lock"; private static int count = 0; static class MyThread extends Thread { @Override public void run() { super.run(); try { while (true) { semaphore.acquire(); Thread.sleep(500); System.out.println(Thread.currentThread().getName() + "get the lock success and run the syn code " + count++); semaphore.release(); Thread.sleep(500); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ MyThread thread1 = new MyThread(); MyThread thread2 = new MyThread(); MyThread thread3 = new MyThread(); thread1.start(); thread2.start(); thread3.start(); } }
CountDownLatch 實(shí)現(xiàn)一個等待機(jī)制,在諸如 等待與會者到達(dá)后,開始會議的使用中。ConutDownLatch 在初始化中一個計數(shù)器,用來指定需要等待的個數(shù)。在并發(fā)編程中,所解決的需求就是,等待所有的線程到達(dá)某個點(diǎn)后。才開始進(jìn)行下一步,有點(diǎn)類似于開會,只有當(dāng)所有的與會人員都到齊后,會議才能開始
public class CountDownLatchExample { private static CountDownLatch mCountDownLatch = new CountDownLatch(3); static class MyThread extends Thread { int awaitTime; public MyThread(int i) { this.awaitTime = i; } @Override public void run() { super.run(); try { while (true) { Thread.sleep(awaitTime); System.out.println(Thread.currentThread().getName() + "arrived " ); mCountDownLatch.countDown(); mCountDownLatch.await(); //可以指定等待時間 System.out.println(Thread.currentThread().getName() + "start meeting " ); } } catch (InterruptedException e) { e.printStackTrace(); } } } public static void main(String[] args){ MyThread thread1 = new MyThread(500); MyThread thread2 = new MyThread(1000); MyThread thread3 = new MyThread(2000); thread1.start(); thread2.start(); thread3.start(); } }
總結(jié)
以上就是本文有關(guān)Java編程中的互斥鎖,信號量和多線程等待機(jī)制實(shí)例詳解的全部內(nèi)容,希望對大家有所幫助。
有興趣的朋友可以了解:Java多線程賣票實(shí)例、Java多線程并發(fā)編程(互斥鎖Reentrant Lock)等。
文章題目:詳解java中的互斥鎖信號量和多線程等待機(jī)制
本文鏈接:http://chinadenli.net/article26/gioccg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供小程序開發(fā)、面包屑導(dǎo)航、網(wǎng)站維護(hù)、標(biāo)簽優(yōu)化、App開發(fā)、網(wǎng)站設(shè)計
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)