国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

ReentrantReadWriteLock實現

2019-11-15 01:08:28
字體:
來源:轉載
供稿:網友
ReentrantReadWriteLock實現

讀寫鎖顧名思義就是提供了一個讀鎖、一個寫鎖,其中讀鎖是共享鎖,寫鎖是獨占鎖。

讀鎖同時可以有多個線程獲取,獲取的前提是沒有其他線程的寫鎖(當然還有同時并發數限制,不過普通java進程也不會起那么多的線程);

寫鎖同時只能有一個線程獲取,獲取的前提是沒有讀鎖和非本線程的寫鎖

ReentrantReadWriteLock 通過state字段的高低位分別控制讀鎖和寫鎖,低16位表示寫鎖,高16位表示讀鎖

讀鎖獲取流程:

  1. 查看鎖有沒有被寫鎖占有,如果被寫鎖占有且占有線程不是當前線程,獲取鎖失敗;
  2. 查看是否可以應該被阻塞,這里分兩種情況:1)公平鎖,如果有線程在排隊,則獲取鎖失敗;2)非公平鎖,如果排隊線程中的第一個是獨占鎖,則獲取鎖失敗,否則插隊(寫鎖的優先級還是稍高一點,不然讀鎖的請求量大時,寫鎖可能永遠被阻塞);
  3. 如果共享鎖的獲取數量沒有達到上限,嘗試通過CAS修改state獲取鎖;
  4. 如果CMS返回成功,則成功得到鎖,然后做一些計數。

讀鎖釋放流程:

  1. 修改計數,并不停嘗試修改state,直到成功;
  2. 然后喚醒隊列中的線程;
  3. 喚醒的是共享線程,共享線程會繼續嘗試喚醒下一個共享線程,然后下一個共享線程繼續....;如果喚醒的是獨占線程,獨占線程就會直接去嘗試搶占鎖。

寫鎖獲取流程:

  1. 查看鎖狀態,如果已經被讀鎖獲取,則失敗;
  2. 如果被寫鎖獨占,但是獨占的線程不是當前線程,則失敗;是當前線程,直接重入;
  3. 判斷是否應該被阻塞,這里也是兩種情況:1)公平鎖,跟讀鎖一樣,如果有排隊的,老老實實排隊;2)非公平鎖,直接搶占;
  4. 上面都OK了,嘗試修改state,獲取成功后,修改獨占線程。

寫鎖釋放流程:

  1. 寫鎖釋放很簡單,因為是線程獨占的,所以直接修改state,然后去隊列里喚醒線程;
  2. 然后喚醒的線程操作同上。

注:

只有獨占鎖的線程可以重入,所以線程獲得寫鎖之后可以繼續重入;

而獲得讀鎖之后接著去取寫鎖會被永遠阻塞,讀鎖是共享的,而且沒有記錄所有共享的線程,上面的流程可以看出獲取寫鎖的時候只要存在讀鎖,就會失敗,所以線程不釋放自己的讀鎖就永遠獲取不到寫鎖。

當然,獲取讀鎖之后是可以再次獲取讀鎖的,這也不算是重入,而是線程與自己共享。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 普陀区| 中西区| 石林| 潮州市| 罗平县| 涿鹿县| 滕州市| 炎陵县| 光山县| 惠东县| 衡山县| 衡阳县| 赣州市| 临海市| 大田县| 云南省| 临猗县| 中卫市| 腾冲县| 耒阳市| 邮箱| 乐山市| 双江| 天峨县| 太原市| 苏尼特右旗| 郁南县| 仪陇县| 荣成市| 于都县| 湖北省| 巴楚县| 隆昌县| 宁晋县| 石阡县| 乐至县| 大理市| 肥城市| 兴化市| 大洼县| 兰州市|