posts - 12, comments - 8, trackbacks - 0, articles - 5
            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

          多線程鎖機制的總結

          Posted on 2010-12-03 10:11 楊羅羅 閱讀(1858) 評論(0)  編輯  收藏 所屬分類: java.thread
          AQS中有一個state字段(int類型,32位)用來描述有多少線程獲持有鎖。在獨占鎖的時代這個值通常是0或者1(如果是重入的就是重入的次數),在共享鎖的時代就是持有鎖的數量。
          自旋等待適合于比較短的等待,而掛起線程比較適合那些比較耗時的等待。

          鎖競爭

          影響鎖競爭性的條件有兩個:鎖被請求的頻率和每次持有鎖的時間。顯然當而這二者都很小的時候,鎖競爭不會成為主要的瓶頸。但是如果鎖使用不當,導致二者都比較大,那么很有可能CPU不能有效的處理任務,任務被大量堆積。

          所以減少鎖競爭的方式有下面三種:

          1. 減少鎖持有的時間
          2. 減少鎖請求的頻率
          3. 采用共享鎖取代獨占鎖

          死鎖

          1.一種情況是線程A永遠不釋放鎖,結果B一直拿不到鎖,所以線程B就“死掉”了
          2.第二種情況下,線程A擁有線程B需要的鎖Y,同時線程B擁有線程A需要的鎖X,那么這時候線程A/B互相依賴對方釋放鎖,于是二者都“死掉”了。
          3.如果一個線程總是不能被調度,那么等待此線程結果的線程可能就死鎖了。這種情況叫做線程饑餓死鎖。比如說非公平鎖中,如果某些線程非?;钴S,在高并發情況下這類線程可能總是拿到鎖,那么那些活躍度低的線程可能就一直拿不到鎖,這樣就發生了“饑餓死”。

          避免死鎖的解決方案是:
          1.盡可能的按照鎖的使用規范請求鎖,另外鎖的請求粒度要?。ú灰诓恍枰i的地方占用鎖,鎖不用了盡快釋放);
          2.在高級鎖里面總是使用tryLock或者定時機制(就是指定獲取鎖超時的時間,如果時間到了還沒有獲取到鎖那么就放棄)。高級鎖(Lock)里面的這兩種方式可以有效的避免死鎖。

          主站蜘蛛池模板: 精河县| 邓州市| 富顺县| 乌兰察布市| 都昌县| 洛川县| 文安县| 政和县| 罗定市| 隆尧县| 页游| 兴和县| 大宁县| 潞城市| 马公市| 塘沽区| 卓尼县| 大兴区| 乳源| 康乐县| 荥阳市| 图木舒克市| 榆树市| 陆良县| 广德县| 历史| 潞西市| 扬州市| 榕江县| 牙克石市| 武胜县| 哈巴河县| 南丹县| 吉木萨尔县| 信阳市| 天柱县| 合作市| 张北县| 辽阳市| 金华市| 丽水市|