日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > java >内容正文

java

Java并发编程(十三)同步容器类

發(fā)布時間:2025/7/14 java 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Java并发编程(十三)同步容器类 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

同步容器類

Vector、HashTable,我用的很少;Vecotr的實現(xiàn)和ArrayList挺接近的,不同的是Vector中很多的方法都用synchronized進行了同步。在不強調(diào)線程安全地時候用ArrayList,在需要線程安全地時候用Vector。
實現(xiàn)線程安全的方法:把它們的狀態(tài)封裝起來,并對每個公有方法都進行同步,使得每次都只有一個線程能訪問容器的狀態(tài)

同步容器類問題

在某些情況下需要額外的客戶端加鎖來保護復(fù)合操作:

  • 迭代,遍歷容器中所有元素
  • 跳轉(zhuǎn),根據(jù)當(dāng)前順序找到一下個元素
  • 條件運算,若沒有則添加
  • 執(zhí)行"先檢查再運行"的demo

    1 public class VectorDemo { 2 // 獲取最后一個元素 3 public static Object getLast(Vector list) { 4 int lastIndex = list.size() - 1; 5 return list.get(lastIndex); 6 } 7 // 刪除最后一個元素 8 public static void deleteLast(Vector list) { 9 int lastIndex = list.size() - 1; 10 list.remove(lastIndex); 11 } 12 }

    在客戶端中給Vector加上鎖,獲得一個線程安全的版本:

    1 public class VectorDemo { 2 // 獲取最后一個元素 3 public static Object getLast(Vector list) { 4 synchronized (list) { 5 int lastIndex = list.size() - 1; 6 return list.get(lastIndex); 7 } 8 } 9 // 刪除最后一個元素 10 public static void deleteLast(Vector list) { 11 synchronized (list) { 12 int lastIndex = list.size() - 1; 13 list.remove(lastIndex); 14 } 15 } 16 }

    支持客戶端加鎖,可以創(chuàng)建一些新的操作,只要知道應(yīng)該使用哪一個鎖,那么這些新的操作就與容器的其他操作一樣都是原子操作。在這個例子中g(shù)etLast和deleteLast與Vector中其他的方法都共享一把鎖,也就是Vector實例自己,同一時刻只能進入其中的一個synchronized代碼塊中。

    在同步容器類中,這些復(fù)合操作在沒有客戶端加鎖的情況下仍然是線程安全的,在其他線程并發(fā)修改容器的時候,可能會有意料之外的行為。

    兩個方法都是線程安全的,但是組合起來會導(dǎo)致異常。可以在客戶端加鎖來解決不可靠迭代的問題,但是要犧牲一些伸縮性。通過在迭代期間持有Vector的鎖可以防止其他線程在迭代期間修改Vector。

    迭代器與ConcurrentModificationException

    對容器進行迭代的標(biāo)準(zhǔn)方式都是用Iterator。在同步容器類中,進行迭代時并沒有考慮到并發(fā)修改,而是用的"及時失敗",終于搞懂了快速失效了。這意味著在迭代時容器被修改將會拋出一個ConcurrentModificationException異常。

    這種及時失敗的迭代器并不是一種完備的處理機制,而只是善意地捕獲并發(fā)錯誤,因此只能作為并發(fā)問題的預(yù)警指示器。采用的方法是,將計數(shù)器的變化與容器關(guān)聯(lián)起來:如果在迭代期間計數(shù)器被修改,那么hasNext或next將拋出ConcurrentModification。然而這種檢查是在沒有同步的情況下進行的,因此可能會看到失效值,而迭代可能并沒有意識到已經(jīng)發(fā)生了修改。

    為什么不希望在迭代的時候加鎖:

  • 容器的規(guī)模很大,或者在每個元素上執(zhí)行的操作時間很長,那么這些線程將長時間等待。
  • 一直持有一個鎖,可能產(chǎn)生死鎖,降低程序的可伸縮性,持有鎖的時間越長,鎖上的競爭越激烈,如果許多線程都等待著鎖被釋放,那么將極大地降低吞吐量和CPU的利用率。
  • 隱藏迭代器

    加鎖可以防止迭代器拋出ConcurrentModificationException,但是要記住在所有對共享容器進行迭代的地方都需要加鎖。

    如果狀態(tài)與保護它的同步代碼之間相隔越遠,那么開發(fā)人員就越容易忘記在訪問狀態(tài)的時候使用正確的同步。正如封裝對象的狀態(tài)有助于維持不變性的條件一樣,封裝對象的同步機制同樣有助于確保實施同步策略。

    容器的hashCode和equals方法同樣會間接地執(zhí)行迭代操作,當(dāng)容器所謂另一個容器的元素或者鍵值時就會出現(xiàn)這種情況。

    轉(zhuǎn)載于:https://www.cnblogs.com/tuhooo/p/8073718.html

    總結(jié)

    以上是生活随笔為你收集整理的Java并发编程(十三)同步容器类的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 诱惑の诱惑筱田优在线播放 | 天天操天天添 | 和黑帮大佬的365 | 综合婷婷久久 | 一区亚洲 | 久久久久女人精品毛片九一 | 日本欧美另类 | 亚洲精品网站在线 | 精品少妇人妻av一区二区 | 欧美日韩国产一区二区三区 | 国产欧美在线播放 | 欧美性受视频 | 成人在线免费播放视频 | 3d动漫精品啪啪一区二区竹菊 | 国产精品久久久久影院 | 日本系列第一页 | 日本在线一区二区三区 | 91香蕉视频在线 | 色网综合 | www久久 | 91成人在线 | 自拍偷拍视频网 | 精品无码国产av一区二区三区 | 精品视频免费播放 | 男女又爽又黄 | 欧美bdsm调教视频 | 狠狠做| 奇米影视7777 | 亚洲 欧美 国产 另类 | 日韩av在线播| 在线观看的毛片 | 久久久久久久久久久久久女过产乱 | 精品无码久久久久国产 | 色噜噜色综合 | 久久福利影院 | 久久精品一二 | 久久久久免费精品视频 | 久久亚洲影院 | 欧美视频色 | 年代下乡啪啪h文 | 亚洲精品av中文字幕在线在线 | 国产欧美一区二区三区在线 | 免费日韩在线 | 制服丝袜天堂 | 女人高潮特级毛片 | 午夜黄色 | 国产一区av在线 | 欧美日韩精品一区二区在线观看 | 777777av| 青娱乐在线免费视频 | 色呦呦日韩精品 | 强行挺进白丝老师里呻吟 | 日韩的一区二区 | 亚洲成a人片77777精品 | 最新国产网站 | 黄色av影院 | 精品人成 | 蜜桃成人在线视频 | 精品少妇人妻av一区二区三区 | av手机| www.激情| 欧美精品成人久久 | 国产馆在线观看 | 男女超碰| 日韩图色| 又黄又爽视频在线观看 | 懂色av一区二区夜夜嗨 | 欧美一级做a爰片免费视频 成人激情在线观看 | 伊人久久久 | 成年人黄国产 | 丰满多毛的大隂户视频 | 久久精品在线播放 | 婷婷色中文字幕 | 久操国产 | 极品白嫩丰满美女无套 | 国产淫片av片久久久久久 | gai视频在线观看资源 | 亚洲av无码一区二区三区在线 | 国产精品99一区二区三区 | 中文免费视频 | 午夜视频一区二区三区 | 亚洲作爱视频 | 久热这里有精品 | 99re在线 | 女王脚交玉足榨精调教 | 黄一区二区三区 | 日本一区久久 | 啪啪综合网 | 成年人在线免费观看 | 国产在线观看无码免费视频 | 国产在线观看免费 | 噜噜av | 中文字幕免费一区 | 特级西西人体444www高清大胆 | 欧美成人动态图 | 色花堂在线 | 叶全真三级 | 男同毛片 | 伊人天堂网 |