【JAVA并發編程實戰】3、同步容器

?

?

  同步容器包括Vector和Hashtable,還有一些由Collections.synchronizedXxx等工廠方法創建的

?

1、同步容器類的問題

同步容器類都是線程安全的,但是有些時候還是要客戶端加鎖來保護復合操作

?

就比如vector的操作,如果又兩個方法一個獲取vector集合的最后一個元素,一個刪除最后一個元素

那么可能兩個線程在同時操作的時候,A線程首先正在獲取最后一個元素,get(lastElement),而在這個過程中如果B元素正在刪除,刪除了最后一個(last)然后就可能導致A線程執行失敗,報錯

?

那么如何避免這個問題呢?

那就是吧獲取最后一個位置的索引和獲取數據復合操作加鎖,使其成為一個原子操作。同理獲取索引和刪除也是加鎖,把容器類作為鎖的對象

?

2、隱藏迭代器

如下

package cn.xf.cp.ch05;import java.util.HashSet;
import java.util.Random;
import java.util.Set;public class HiddenIterator
{private final Set<Integer> set = new HashSet<Integer>();//添加與刪除操作public synchronized void add(Integer i) { set.add(i); }public synchronized void remove(Integer i) { set.remove(i); }public void addTenThings(){Random r = new Random();for(int i = 0; i < 10; ++i){add(r.nextInt());}//注意這里可能會拋出異常,因為這里使用了set,但是沒有加鎖,也就是應該加上HiddenIterator的對象鎖才可以//而在輸出日志的時候,我們的set會調用toString方法,而這個方法會對容器進行迭代//也就是在調用toString方法的時候可能set會被修改,而迭代器在迭代的時候如果計數器被修改那么hasNext或next//將拋出ConcurrentModificationException異常System.out.println("DEBUG: added ten elements to " + set);}
}

?

轉載于:https://www.cnblogs.com/cutter-point/p/5998491.html

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

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

相關文章

php 動態加載html內容_ThinkPHP5.1+Swoole實現的開源內容管理框架

一款支持Swoole的開源內容管理框架&#xff0c;基于ThinkPHP5.1開發&#xff0c;同時支持PHP-FPM和Swoole雙模式&#xff0c;讓WEB開發更快!主要特性更改框架協議為MIT,讓你更自由地飛基于ThinkPHP 5.1重構&#xff0c;但核心代碼兼容5.0版本&#xff0c;保證老用戶最小升級成本…

MarkDown語言

參考&#xff1a; 參考&#xff1a;https://typora.io/參考&#xff1a;https://caret.io/Markdown是一種輕量級標記語言&#xff0c;創始人為約翰格魯伯&#xff08;英語&#xff1a;John Gruber&#xff09;。 它允許人們“使用易讀易寫的純文本格式編寫文檔&#xff0c;然后…

${fn:} 函數

調用這樣一個頭文件<% taglib prefix"fn" uri"http://java.sun.com/jsp/jstl/functions " %> 下面就可以直接調用以下的函數。 函數名 函數說明 使用舉例 fn:contains 判斷字符串是否包含另外一個字符串 <c:if test"${fn:contains(name, s…

linux7.2配置多路徑軟件,RHEL6使用系統自帶多路徑軟件配置多路徑,rhel6路徑

RHEL6使用系統自帶多路徑軟件配置多路徑&#xff0c;rhel6路徑1、多路徑的主要功能多路徑一般配合存儲設備實現如下功能&#xff1a;故障的切換和恢復IO流量的負載均衡磁盤的虛擬化2、查看系統自帶的多路徑軟件是否安裝[rootcluster01 ~]# rpm -qa |grep device-mapperdevice-m…

小甲魚python課后答案40講_小甲魚Python 第30講課后習題看不懂

本帖最后由 keydnal_aaron 于 2018-1-18 14:17 編輯 這個測試的文本里面是英文字符串&#xff0c;如果環境不同&#xff0c;注意下文本內容的編碼方式&#xff0c;我的編程環境是centos7python3.6.4 from os import walk,getcwd from os.path import join def search_file():查…

SM4密碼算法(附源碼)

SM4是我們自己國家的一個分組密碼算法&#xff0c;是國家密碼管理局于2012年發布的。網址戳→_→&#xff1a;http://www.cnnic.NET.cn/jscx/mixbz/sm4/具體的密碼標準和算法官方有非常詳盡的PDF文檔以供查閱&#xff0c;戳→_→&#xff1a;http://218.241.108.63/wiki/images…

vim ctrlp_使用Ctrlp和Ctag使Vim更智能

vim ctrlpby _haochuan通過_haochuan 使用Ctrlp和Ctag使Vim更智能 (Make Your Vim Smarter Using Ctrlp and Ctags) I absolutely love Vim, and I use Vim for all my coding and writing from year to year. Although more are more people, especially for those are worki…

linux系統可以無顯卡運行嗎,Linux操作系統無顯卡安裝方式

顯卡安裝方法&#xff1a;操作步驟&#xff1a;1、SBC上裝上顯卡&#xff0c;并啟動安裝程序2、安裝linux系統并選擇相應的安裝包(選擇lilo啟動加載程序)如果安裝時以GRUB方式加載的&#xff0c;需要在Grub.conf中將有關圖形的語句屏蔽掉。#splashimage(hd0,0)/grub/splash.xpm…

軟件工程專業實習可以做什么_想要獲得軟件工程實習機會? 這里有一些想法可以幫助您...

軟件工程專業實習可以做什么by Tatiana Doyle塔蒂亞娜道爾(Tatiana Doyle) 想要獲得軟件工程實習機會&#xff1f; 這里有一些想法可以幫助您。 (Looking to land a software engineering internship? Here are some thoughts to help you.) A note: this post is simply mea…

ubuntu 簡單配置samba

關鍵字: ubuntu samba今天在家&#xff0c;閑著沒事&#xff0c;就想學習一下samba 來實現windows xp 訪問ubuntu 的文件夾&#xff08;家里有兩臺pc&#xff09;&#xff0c;google了很多文章&#xff0c;但是很多都沒有用&#xff0c;不過鳥哥的文章有很清楚的介紹&#xff0…

python3.8文檔_python 3.8的新功能

演示和工具 添加了一個基準腳本&#xff0c;用于計時訪問變量的各種方式&#xff1a; Tools/scripts/var_access_benchmark.py . &#xff08;由Raymond Hettinger在 bpo-35884 &#xff09; 以下是自Python3.3以來性能改進的摘要&#xff1a; Python version 3.3 3.4 3.5 3.6 …

mysql數據庫備份及還原

一、Mysql數據庫備份指令格式&#xff1a; mysqldump -h主機名 -P端口 -u用戶名 -p密碼 (–database) 數據庫名 > 文件名.sql 注&#xff1a;直接cmd執行該指令即可&#xff0c;不需要先mysql -u root -p鏈接數據庫 1、備份MySQL數據庫的命令mysqldump -hhostname -uuserna…

linux隱藏apache信息,Apache防盜鏈和隱藏版本信息-linux-centos運維

有需要服務器方面的需求和咨詢&#xff0c;可以聯系博主 QQ 7271895一、防盜鏈二、隱藏版本信息實驗要求&#xff1a;三臺虛擬機分別是&#xff1a;linux和兩臺windows虛擬機&#xff0c;linux虛擬機為服務器&#xff0c;Windows7-1為客戶端&#xff0c;Windows7-2為盜鏈端。實…

查看oracle當前的連接數

SQL> select count(*) from v$session #當前的連接數SQL> Select count(*) from v$session where statusACTIVE #并發連接數SQL> select value from v$parameter where name processes --數據庫允許的最大連接數SQL> show parameter processes #最大連接 SQL> …

led顯示屏控制卡接線圖解_Led顯示屏出現花屏是什么原因

Led顯示屏已經成為現在人們推廣的一種形式了&#xff0c;很多地方都是離不開led顯示屏的使用的。由于Led顯示屏的五彩絢爛&#xff0c;也更加吸引人們的眼球。不過在使用過程中&#xff0c;也會遇到Led顯示屏花屏的情況。那么&#xff0c;Led顯示屏出現花屏是什么原因呢?下面偉…

【javascript】獲取 格式化時間

function getDate() {var myDate new Date();var month myDate.getMonth() 1;var day myDate.getDate();month (month.toString().length 1) ? ("0" month) : month;day (day.toString().length 1) ? ("0" day) : day;var result myDate.getF…

深度強化學習和強化學習_深度強化學習:從哪里開始

深度強化學習和強化學習by Jannes Klaas簡尼斯克拉斯(Jannes Klaas) 深度強化學習&#xff1a;從哪里開始 (Deep reinforcement learning: where to start) Last year, DeepMind’s AlphaGo beat Go world champion Lee Sedol 4–1. More than 200 million people watched as …

制作一個大風車加載條

一、前言 不想使用普通的那種轉圈的加載條&#xff0c;所以找了一個大風車的圖片&#xff0c;想要用旋轉的大風車來表示加載中。   一般都會想著將大風車圖片設置成ImageView組件&#xff0c;然后給這個組件添加一個旋轉動畫就可以了&#xff0c;但是我突然想到我是想寫加載條…

Android OkHttp完全解析 是時候來了解OkHttp了

Android OkHttp完全解析 是時候來了解OkHttp了 標簽&#xff1a; AndroidOkHttp2015-08-24 15:36 316254人閱讀 評論(306) 收藏 舉報分類&#xff1a;【android 進階之路】&#xff08;67&#xff09; 版權聲明&#xff1a;本文為博主原創文章&#xff0c;未經博主允許不得轉載…

c盤users的用戶名怎么改_做完這幾個操作,我從C盤中清理了30G垃圾文件

信息技術土著&#xff0c;一個有營養的公眾號有個存在學說&#xff0c;比說一個人的身體某部位&#xff0c;如果不痛&#xff0c;你很少感覺他是存在的&#xff0c;但是某一天&#xff0c;因為某種原因&#xff0c;它突然很痛了&#xff0c;然后你每時每刻都會感覺到它的存在了…