电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

Java信號量全解析

瀏覽:107日期:2022-08-17 17:56:02
前言:

Semaphore(信號量) 是一個線程同步結構,用于在線程間傳遞信號,以避免出現信號丟失(譯者注:下文會具體介紹),或者像鎖一樣用于保護一個關鍵區域。自從5.0開始,jdk在java.util.concurrent包里提供了Semaphore 的官方實現,因此大家不需要自己去實現Semaphore。但是還是很有必要去熟悉如何使用Semaphore及其背后的原理

內容主題:一、簡單的Semaphore實現

下面是一個信號量的簡單實現:

public class Semaphore {private boolean signal = false;public synchronized void take() {this.signal = true;this.notify();1011}public synchronized void release() throws InterruptedException{while(!this.signal) wait();this.signal = false;}}

Take方法發出一個被存放在Semaphore內部的信號,而Release方法則等待一個信號,當其接收到信號后,標記位signal被清空,然后該方法終止。

使用這個semaphore可以避免錯失某些信號通知。用take方法來代替notify,release方法來代替wait。如果某線程在調用release等待之前調用take方法,那么調用release方法的線程仍然知道take方法已經被某個線程調用過了,因為該Semaphore內部保存了take方法發出的信號。而wait和notify方法就沒有這樣的功能。

當用semaphore來產生信號時,take和release這兩個方法名看起來有點奇怪。這兩個名字來源于后面把semaphore當做鎖的例子,后面會詳細介紹這個例子,在該例子中,take和release這兩個名字會變得很合理。

二、使用Semaphore來產生信號

下面的例子中,兩個線程通過Semaphore發出的信號來通知對方

Semaphore semaphore = new Semaphore();SendingThread sender = new SendingThread(semaphore);ReceivingThread receiver = new ReceivingThread(semaphore);receiver.start();sender.start();public class SendingThread {Semaphore semaphore = null;public SendingThread(Semaphore semaphore){this.semaphore = semaphore;}public void run(){while(true){//do something, then signalthis.semaphore.take();}}}public class RecevingThread {Semaphore semaphore = null;public ReceivingThread(Semaphore semaphore){this.semaphore = semaphore;}public void run(){while(true){this.semaphore.release();//receive signal, then do something...}}}三、可計數的Semaphore

上面提到的Semaphore的簡單實現并沒有計算通過調用take方法所產生信號的數量。可以把它改造成具有計數功能的Semaphore。下面是一個可計數的Semaphore的簡單實現。

public class CountingSemaphore {private int signals = 0;public synchronized void take() {this.signals++;0809this.notify();}public synchronized void release() throws InterruptedException{while(this.signals == 0) wait();this.signals--;}}四、有上限的Semaphore

上面的CountingSemaphore并沒有限制信號的數量。下面的代碼將CountingSemaphore改造成一個信號數量有上限的BoundedSemaphore。

public class BoundedSemaphore {private int signals = 0;private int bound = 0;public BoundedSemaphore(int upperBound){this.bound = upperBound;}public synchronized void take() throws InterruptedException{while(this.signals == bound) wait();this.signals++;this.notify();}public synchronized void release() throws InterruptedException{while(this.signals == 0) wait();this.signals--;this.notify();}}

在BoundedSemaphore中,當已經產生的信號數量達到了上限,take方法將阻塞新的信號產生請求,直到某個線程調用release方法后,被阻塞于take方法的線程才能傳遞自己的信號。

五、把Semaphore當鎖來使用

當信號量的數量上限是1時,Semaphore可以被當做鎖來使用。通過take和release方法來保護關鍵區域。請看下面的例子:

BoundedSemaphore semaphore = new BoundedSemaphore(1);...semaphore.take();try{//critical section} finally {semaphore.release();}

在前面的例子中,Semaphore被用來在多個線程之間傳遞信號,這種情況下,take和release分別被不同的線程調用。但是在鎖這個例子中,take和release方法將被同一線程調用,因為只允許一個線程來獲取信號(允許進入關鍵區域的信號),其它調用take方法獲取信號的線程將被阻塞,知道第一個調用take方法的線程調用release方法來釋放信號。對release方法的調用永遠不會被阻塞,這是因為任何一個線程都是先調用take方法,然后再調用release。

通過有上限的Semaphore可以限制進入某代碼塊的線程數量。設想一下,在上面的例子中,如果BoundedSemaphore 上限設為5將會發生什么?意味著允許5個線程同時訪問關鍵區域,但是你必須保證,這個5個線程不會互相沖突。否則你的應用程序將不能正常運行。

必須注意,release方法應當在finally塊中被執行。這樣可以保在關鍵區域的代碼拋出異常的情況下,信號也一定會被釋放。

以上就是Java信號量全解析的詳細內容,更多關于Java信號量的資料請關注好吧啦網其它相關文章!

標簽: Java
相關文章:
主站蜘蛛池模板: 金属回收_废铜废铁回收_边角料回收_废不锈钢回收_废旧电缆线回收-广东益夫金属回收公司 | 老城街小面官网_正宗重庆小面加盟技术培训_特色面馆加盟|牛肉拉面|招商加盟代理费用多少钱 | 3dmax渲染-效果图渲染-影视动画渲染-北京快渲科技有限公司 | 游泳池设计|设备|配件|药品|吸污机-东莞市太平洋康体设施有限公司 | 油罐车_加油机_加油卷盘_加油机卷盘_罐车人孔盖_各类球阀_海底阀等车用配件厂家-湖北华特专用设备有限公司 | 【甲方装饰】合肥工装公司-合肥装修设计公司,专业从事安徽办公室、店面、售楼部、餐饮店、厂房装修设计服务 | 东莞韩创-专业绝缘骨架|马达塑胶零件|塑胶电机配件|塑封电机骨架厂家 | 空心明胶胶囊|植物胶囊|清真胶囊|浙江绿键胶囊有限公司欢迎您! | 洛阳网站建设_洛阳网站优化_网站建设平台_洛阳香河网络科技有限公司 | 化妆品加工厂-化妆品加工-化妆品代加工-面膜加工-广东欧泉生化科技有限公司 | 广东燎了网络科技有限公司官网-网站建设-珠海网络推广-高端营销型外贸网站建设-珠海专业h5建站公司「了了网」 | 工装定制/做厂家/公司_工装订做/制价格/费用-北京圣达信工装 | atcc网站,sigma试剂价格,肿瘤细胞现货,人结肠癌细胞株购买-南京科佰生物 | 工业冷却塔维修厂家_方形不锈钢工业凉水塔维修改造方案-广东康明节能空调有限公司 | 方源木业官网-四川木门-全国木门专业品牌 | 钢骨架轻型板_膨石轻型板_钢骨架轻型板价格_恒道新材料 | 顶空进样器-吹扫捕集仪-热脱附仪-二次热解吸仪-北京华盛谱信仪器 | Eiafans.com_环评爱好者 环评网|环评论坛|环评报告公示网|竣工环保验收公示网|环保验收报告公示网|环保自主验收公示|环评公示网|环保公示网|注册环评工程师|环境影响评价|环评师|规划环评|环评报告|环评考试网|环评论坛 - Powered by Discuz! | 石家庄网站建设|石家庄网站制作|石家庄小程序开发|石家庄微信开发|网站建设公司|网站制作公司|微信小程序开发|手机APP开发|软件开发 | 杭州成人高考_浙江省成人高考网上报名| 灰板纸、灰底白、硬纸板等纸品生产商-金泊纸业 | 河南凯邦机械制造有限公司 | 免费分销系统 — 分销商城系统_分销小程序开发 -【微商来】 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 深圳彩钢板_彩钢瓦_岩棉板_夹芯板_防火复合彩钢板_长鑫 | 3d可视化建模_三维展示_产品3d互动数字营销_三维动画制作_3D虚拟商城 【商迪3D】三维展示服务商 广东健伦体育发展有限公司-体育工程配套及销售运动器材的体育用品服务商 | 名律网-法律问题咨询-找律师-法律知识| 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 书信之家_书信标准模板范文大全 最新范文网_实用的精品范文美文网 | 达利园物流科技集团- | 高光谱相机-近红外高光谱相机厂家-高光谱成像仪-SINESPEC 赛斯拜克 | 合肥抖音SEO网站优化-网站建设-网络推广营销公司-百度爱采购-安徽企匠科技 | 北京遮阳网-防尘盖土网-盖土草坪-迷彩网-防尘网生产厂家-京兴科技 | 高铝矾土熟料_细粉_骨料_消失模_铸造用铝矾土_铝酸钙粉—嵩峰厂家 | 鼓风干燥箱_真空烘箱_高温干燥箱_恒温培养箱-上海笃特科学仪器 | 大流量卧式砂磨机_强力分散机_双行星双动力混合机_同心双轴搅拌机-莱州市龙跃化工机械有限公司 | YAGEO国巨电容|贴片电阻|电容价格|三星代理商-深圳市巨优电子有限公司 | 活性氧化铝球|氧化铝干燥剂|分子筛干燥剂|氢氧化铝粉-淄博同心材料有限公司 | 烟气在线监测系统_烟气在线监测仪_扬尘检测仪_空气质量监测站「山东风途物联网」 | 电伴热系统施工_仪表电伴热保温箱厂家_沃安电伴热管缆工业技术(济南)有限公司 | 中图网(原中国图书网):网上书店,尾货特色书店,30万种特价书低至2折! |