Java并發編程實戰 第14章 構建自定義的同步工具

狀態依賴性

定義:只有滿足特定的狀態才能繼續執行某些操作(這些操作依賴于固定的狀態,這些狀態需要等待別的線程來滿足)。

FutureTask,Semaphroe,BlockingQueue等,都是狀態依賴性的類。

條件隊列

條件對列:條件對列就是由于不滿足繼續的條件而被wait操作阻塞的線程隊列。他們都在等待條件滿足,然后被喚醒。

條件謂詞:狀態依賴性依賴的前提條件。如BlockingQueue中的isFull,isEmpty等。

條件等待中存在三個要素:加鎖 + 條件謂詞 + wait方法

wait方法和notify方法

我理解的wait方法:會釋放鎖+阻塞當前線程,放入條件對列,等待被喚醒,喚醒后,需要重新獲得鎖,獲得鎖之后繼續執行wait那句代碼所在的位置(即使wait在鎖塊的中間代碼部分)。

notify(All)方法:只是喚醒條件隊列中的線程。但是不釋放鎖。

使用wait notify方法的時候,一定要持有條件對列所屬的鎖。

使用輪詢和休眠實現簡單的狀態依賴性阻塞

  1. while(true)
  2. ????????{
  3. ????????????//這里不對循環上鎖,不然這個鎖就無法釋放了,不對休眠上鎖,休眠上鎖,在休眠的時候別人也無法操作,永遠都不可能有元素出去
  4. ????????????synchronized (this)
  5. ????????????{
  6. ????????????????//如果隊列不是滿的,那么就放入元素
  7. ????????????????if(!this.isFull())
  8. ????????????????{
  9. ????????????????????this.doPut(v);
  10. ????????????????????return;
  11. ????????????????}
  12. ????????????}
  13. ????????????//否則休眠,退出cpu占用
  14. ????????????Thread.sleep(SLEEP_GRANULARITY);
  15. ????????}
  16. ????}

使用條件隊列來實現狀態依賴性阻塞

?

  1. public synchronized void put(V v) throws InterruptedException
  2. ???{
  3. ???????while(this.isFull())
  4. ???????{
  5. ???????????//這里掛起程序,會釋放鎖
  6. ???????????this.wait();
  7. ???????}
  8. ???????//如果隊列不為滿的,那么程序被喚醒之后從新獲取鎖
  9. ???????this.doPut(v);
  10. ???????//執行結束,喚醒其他隊列
  11. ???????this.notifyAll();
  12. ???}

注意上面要使用while。

對于監視器來說,wait操作產生的線程,都放在這個監視器唯一的條件隊列里。

如果使用Lock,可以使用condition來產生不同的條件對列。

注意上面的?this.notifyAll();代碼,將會喚醒這個監視器條件隊列里所有等待的線程。其實這里只用喚醒因為empty阻塞的線程,而不用喚醒因為full阻塞的線程。

如果使用?this.notify(),只會隨機喚醒一個,如果喚醒的是因為full堵塞的線程,那么就可能沒有正常喚醒。影響性能,甚至造成活躍性的危險。

這種情況下,可以使用Lock和Condition來改造。

  1. protected final Lock lock = new ReentrantLock();
  2. private final Condition notFull = lock.newCondition();
  3. private final Condition notEmpty = lock.newCondition();
  4. ?public void put(T x) throws InterruptedException {
  5. ????????lock.lock();
  6. ????????try {
  7. ????????????while (count == items.length)
  8. ????????????????notFull.await();
  9. ????????????items[tail] = x;
  10. ????????????if (++tail == items.length)
  11. ????????????????tail = 0;
  12. ????????????++count;
  13. ????????????notEmpty.signal();
  14. ????????} finally {
  15. ????????????lock.unlock();
  16. ????????}
  17. ????}

注意:這里不是signalAll。

閥門類

使用閉鎖CountDownLatch,傳入1的時候可以作為閥門開關。前提是在其他線程的第一步先執行開關的await。使用開關的countDown方法就可以打開開關。

但是這種閥門,只能打開,不能關閉。

使用wait和notifyAll來實現可重新關閉的閥門。

Condition

注意,由于Condition對象繼承自Object,它也有wait,notify,notifyAll方法,其實它對應方法名字應該是await,signal,signalAll。

?

轉載于:https://www.cnblogs.com/xiaolang8762400/p/7074721.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/455367.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/455367.shtml
英文地址,請注明出處:http://en.pswp.cn/news/455367.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

webserver接口_SpringBoot內置源碼解析WebServer初始化過程

WebServer 初始化過程在上一節中 Spring Boot 初始化了 WebServer 對應的工廠類。同時,我們也知道對應 Web容器的WebServer實現類有:TomcatWebServer、JettyWebServer和UndertowWebServer。這節重點講解這些 WebServer 是如何被初始化,又如何啟動的。Web…

提升應用程序彈性:保障工作負載正常運行

通過集群化、復制、快照、微服務和應用程序設計來提高企業工作負載的應用程序彈性和可用性。 應用程序的彈性和可用性是現代企業工作負載的關鍵屬性。應用程序需要在硬件故障發生后,扛過服務故障(例如負載平衡器和域名系統錯誤)保持工作狀態,并且可以忍受…

JDBC筆記01-JDBC,Connection,Statement,ResultSet,PreparedStatement,Properties

學習目標 理解JDBC原理 掌握Connection接口的使用 掌握Statement接口的使用 掌握ResultSet接口的使用 掌握PreparedStatement接口的使用 掌握Properties類與配置文件的使用 JDBC 概念 JDBC (Java DataBase Connectivity) Java數據庫連接技術的簡稱,提供連接各種常…

NVDKC6416平臺H.264算法優化

本文轉載自:http://blog.csdn.net/embedesign/archive/2009/09/15/4556486.aspx,版權歸原作者,編輯:小乙哥 多媒體通信終端設備具有廣泛的應用前景,可以應用于視頻會議、可視電話、PDA、數字電視等各個領域&#xff0…

攔截器及 Spring MVC 整合

一、實驗介紹 1.1 實驗內容 本節課程主要利用 Spring MVC 框架實現攔截器以及 Spring MVC 框架的整合。 1.2 實驗知識點 Spring MVC 框架攔截器1.3 實驗環境 JDK1.8Eclipse JavaEE二、實驗步驟 2.1 攔截器實現 在項目 hrms 的目錄 src/main/java 下新建包 com.shiyanlou.interc…

高德地圖軌跡回放_高德地圖上線了一個新功能….

文、路人甲TM德地圖這兩天剛上線了一個叫做「家人地圖」的功能,所謂家人地圖顧名思義,就是你可以通過高德地圖組建一個家人圈,在這個圈子里面你可以看到你的家人在什么位置,當你的家人到達什么位置的時候自動發送通知或者警告&…

You have new mail in /var/spool/mail/root消除提示的方法

有時在進入系統的時候經常提示You have new mail in /var/spool/mail/root 你覺得煩人---解決方法: 修改系統配置文件/etc/profile,告訴系統不要去檢查郵箱. 具體操作:命令行輸入:echo "unset MAILCHECK" >> /etc…

c3p0-config.xml文件簡單說明與備忘

<?xml version"1.0" encoding"UTF-8"?> <c3p0-config><named-config name"mysql"><!-- 配置數據庫用戶名 --><property name"user">root</property><!-- 配置數據庫密碼 --><property…

python 消息隊列 get是從隊首還是隊尾取東西_從零開始Python對redis作為消息隊列的使用...

一、Redis 服務1、安裝yum install redis2、 python安裝支持模塊/opt/python2.7.13/bin/pip install redis3、 和redis的簡單直接交互In [1]: import redisIn [2]: rc redis.Redis(host192.168.8.237,port6379,decode_responsesTrue)In [5]: rc.set(imoocc,jeson)Out[5]: True…

‘’和“”

單引號引的數據是char類型的 雙引號引的數據是String類型的 單引號只能引一個字符 而雙引號可以引0個及以上 字符&#xff08;Character&#xff09;是指人類語言的最小的表義符號&#xff0c;字符是指計算機中使用的字母、數字和符號&#xff0c;包括1、2、3、A、B、C、#、&am…

Spring整合Quartz定時任務 在集群、分布式系統中的應用(Mysql數據庫環境)

轉載&#xff1a;http://www.cnblogs.com/jiafuwei/p/6145280.html 單個Quartz實例能給予你很好的Job調度能力&#xff0c;但它不能滿足典型的企業需求&#xff0c;如可伸縮性、高可靠性滿足。假如你需要故障轉移的能力并能運行日益增多的 Job&#xff0c;Quartz集群勢必成為你…

JDBC筆記02-數據庫連接池 Spring JDBC

今日內容 數據庫連接池Spring JDBC : JDBC Template 數據庫連接池 概念: 其實就是一個容器(集合),存放數據庫連接的容器 當系統初始化好后,容器被創建,容器中會申請一些連接對象,當用戶來訪問數據庫時,從容器中獲取連接對象,用戶訪問完之后,會將連接對象歸還給容器 好處:…

20溫控f1什么意思_歐姆龍溫控器是什么 歐姆龍溫控器介紹【圖文】

歐姆龍溫控器&#xff0c;乍一眼看上去真的很難理解這到底是一個什么產品&#xff0c;或者是一個有什么用處的溫控器&#xff0c;對于這個比較淺顯的問題&#xff0c;不知道大家會有什么樣地感受&#xff0c;是不是正在一頭霧水的等著我進行解答呢?經過我比較淺顯的分析&#…

bootstrap 解決彈出窗口(modal) 常見問題

無法使用鍵盤esc關閉窗口方法&#xff1a; 首先在modal容器的div中增加屬性tabindex"-1"&#xff0c;其次設置鍵盤ESC屬性keyboard為true&#xff1b; 方法1&#xff1a;使用js打開窗口時 $(“#modal”).modal({keyboard:true}) 方法2&#xff1a;使用H5屬性在modal窗…

zabbix3.2學習筆記(二):服務端安裝

2019獨角獸企業重金招聘Python工程師標準>>> 一般小公司大多將zabbix web端和zabbix server部署在同一臺主機上&#xff0c;其實二者是可以分開的&#xff0c;web GUI配置連接到對應的數據庫就行&#xff0c;讓zabbix server和MySQL數據庫在同一臺主機上便于數據快速…

H.264解碼器中CAVLC碼表查找算法的分析與優化

0 引言 近年來&#xff0c;隨著信息技術飛速發展和互聯網的日益普及&#xff0c;尤其是以視頻為信息主要來源的多媒體領域越來越受到人們的關注。H&#xff0e;264是ITU-T的視頻編碼專家組(VCEG)和ISO&#xff0f;IEC的活動圖像編碼專家組(MPEG)的聯合視頻組(Joint Video Te…

python求加速度_如何利用Python 為自然語言處理加速度

自去年發布 Python 的指代消解包(coreference resolution package)之后&#xff0c;很多用戶開始用它來構建許多應用程序&#xff0c;而這些應用與我們最初的對話應用完全不同。利用 spaCy 和一點點 Cython 給 NLP 加速。自去年發布 Python 的指代消解包(coreference resolutio…

druid.properties文件的配置

# druid.properties文件的配置 driverClassNamecom.mysql.jdbc.Driver urljdbc:mysql://127.0.0.1:3306/plan usernameroot password # 初始化連接數量 initialSize5 # 最大連接數 maxActive10 # 最大超時時間 maxWait3000

jquery+easyui開發、培訓文檔

目 錄 1.... Accordion&#xff08;可折疊標簽&#xff09;....................................................................................... 2 1.1 實例.............................................................................................…

HAProxy用法詳解 全網最詳細中文文檔

一、HAProxy簡介&#xff08;1&#xff09;HAProxy 是一款提供高可用性、負載均衡以及基于TCP&#xff08;第四層&#xff09;和HTTP&#xff08;第七層&#xff09;應用的代理軟件&#xff0c;支持虛擬主機&#xff0c;它是免費、快速并且可靠的一種解決方案。 HAProxy特別適用…