亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

java集合框架線程同步代碼詳解

2024-07-13 10:15:12
字體:
來源:轉載
供稿:網友

List接口的大小可變數組的實現。實現了所有可選列表操作,并允許包括null在內的所有元素。除了實現List接口外,此類還提供一些方法來操作內部用來存儲列表的數組的大小。(此類大致上等同于Vector類,除了此類是不同步的。)size、isEmpty、get、set、iterator和listIterator操作都以固定時間運行。add操作以分攤的固定時間運行,也就是說,添加n個元素需要O(n)時間。其他所有操作都以線性時間運行(大體上講)。與用于LinkedList實現的常數因子相比,此實現的常數因子較低。每個ArrayList實例都有一個容量。該容量是指用來存儲列表元素的數組的大小。它總是至少等于列表的大小。隨著向ArrayList中不斷添加元素,其容量也自動增長。并未指定增長策略的細節,因為這不只是添加元素會帶來分攤固定時間開銷那樣簡單。在添加大量元素前,應用程序可以使用ensureCapacity操作來增加ArrayList實例的容量。這可以減少遞增式再分配的數量。

注意,此實現不是同步的。

如果多個線程同時訪問一個ArrayList實例,而其中至少一個線程從結構上修改了列表,那么它必須保持外部同步。(結構上的修改是指任何添加或刪除一個或多個元素的操作,或者顯式調整底層數組的大小;僅僅設置元素的值不是結構上的修改。)這一般通過對自然封裝該列表的對象進行同步操作來完成。如果不存在這樣的對象,則應該使用Collections.synchronizedList方法將該列表“包裝”起來。這最好在創建時完成,以防止意外對列表進行不同步的訪問:

Listlist=Collections.synchronizedList(newArrayList(...));

此類的iterator和listIterator方法返回的迭代器是快速失敗的:在創建迭代器之后,除非通過迭代器自身的remove或add方法從結構上對列表進行修改,否則在任何時間以任何方式對列表進行修改,迭代器都會拋出ConcurrentModificationException。因此,面對并發的修改,迭代器很快就會完全失敗,而不是冒著在將來某個不確定時間發生任意不確定行為的風險。

注意,迭代器的快速失敗行為無法得到保證,因為一般來說,不可能對是否出現不同步并發修改做出任何硬性保證??焖偈〉鲿M最大努力拋出ConcurrentModificationException。因此,為提高這類迭代器的正確性而編寫一個依賴于此異常的程序是錯誤的做法:迭代器的快速失敗行為應該僅用于檢測bug。

如上所示,現在建立一個list集合,一個線程對集合進行寫入操作,一個線程進行刪除操作

java;">import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import java.util.Random;public class MyArrayList {	/**    * 創建一個列表,一個線程進行寫入,一個線程讀取 iterator 和 listIterator 方法返回的迭代器是快速失敗的    */	public void readWrite() {		List<Integer> nums = new ArrayList<Integer>();		List<Integer> synNums = Collections.synchronizedList(nums);		//啟動寫入線程 		new WriteListThread(synNums).start();		//啟動刪除線程 		new DeleteListThread(synNums).start();	}	public static void main(String[] args) {		new MyArrayList().readWrite();	}}class WriteListThread extends Thread {	private List<Integer> nums;	public WriteListThread(List<Integer> nums) {		super(“WriteListThread”);		this.nums = nums;	}	// 不停寫入元素1 	public void run() {		while (true) {			nums.add(new Random().nextint(1000));			System.out.println(Thread.currentThread().getName());		}	}}class DeleteListThread extends Thread {	private List<Integer> nums;	public DeleteListThread(List<Integer> nums) {		super(“DeleteListThread”);		this.nums = nums;	}	// 刪除第一個元素 	public void run() {		while (true) {			try{				System.out.println(Thread.currentThread().getName()+”:”+nums.remove(0));			}			catch(Exception e){				continue ;			}		}	}}

通過List<Integer>synNums=Collections.synchronizedList(nums);就能對原子操作進行同步了,但是官方api示例為什么要自己手動添加同步呢?

List list = Collections.synchronizedList(new ArrayList());  synchronized(list) {    Iterator i = list.iterator(); // Must be in synchronized block    while (i.hasNext())      foo(i.next());  } 

查看Collections.synchronizedList的源代碼

SynchronizedCollection(Collection<E> c) {       if (c==null)         throw new NullPointerException();     this.c = c;       mutex = this;     } 
import java.util.ArrayList;import java.util.Collections;import java.util.Iterator;import java.util.List;import java.util.Random;public class MyArrayList {	/**    * 創建一個列表,一個線程進行寫入,一個線程讀取 iterator 和 listIterator 方法返回的迭代器是快速失敗的    */	public void readWrite() {		List<Integer> nums = new ArrayList<Integer>();		List<Integer> synNums = Collections.synchronizedList(nums);		//啟動寫入線程 		new WriteListThread(synNums).start();		//啟動刪除線程 		new DeleteListThread(synNums).start();	}	public static void main(String[] args) {		new MyArrayList().readWrite();	}}class WriteListThread extends Thread {	private List<Integer> nums;	public WriteListThread(List<Integer> nums) {		super("WriteListThread");		this.nums = nums;	}	// 不停寫入元素1 	public void run() {		while (true) {			nums.add(new Random().nextint(1000));			System.out.println(Thread.currentThread().getName());		}	}}class DeleteListThread extends Thread {	private List<Integer> nums;	public DeleteListThread(List<Integer> nums) {		super("DeleteListThread");		this.nums = nums;	}	// 刪除第一個元素 	public void run() {		while (true) {			try{				System.out.println(Thread.currentThread().getName()+":"+nums.remove(0));			}			catch(Exception e){				continue ;			}		}	}}

可見對于集合同步操作,使用Collections的同步包裝工具類,還需要對非原子操作用戶還需要手動進行同步

如下所示,加一個線程,對集合進行讀取

class ReadListThread extends Thread {	private List<Integer> nums;	public ReadListThread(List<Integer> nums) {		super(“ReadListThread”);		this.nums = nums;	}	// 不停讀取元素,非原子操作,則需要手動加上鎖 	public void run() {		while (true) {			//休眠,將鎖交給其他線程 			try {				Thread.sleep(1000);			}			catch (InterruptedException e1) {				e1.printStackTrace();			}			synchronized (nums) {				if (nums.size() > 100) {					Iterator<Integer> iter = nums.iterator();					while (iter.hasNext()) {						System.out.println(Thread.currentThread().getName() 						                + ”:” + iter.next());						;					}				} else{					try {						nums.wait(1000);					}					catch (InterruptedException e) {						e.printStackTrace();					}				}			}		}	}}

總結

以上就是本文關于java集合框架線程同步代碼詳解的全部內容,希望對大家有所幫助。感興趣的朋友可以繼續參閱本站其他相關專題,如有不足之處,歡迎留言指出。感謝朋友們對本站的支持!


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
日韩中文第一页| 一区二区三区动漫| 欧美激情乱人伦一区| 亚洲欧洲一区二区三区久久| 欧美国产高跟鞋裸体秀xxxhd| 日本最新高清不卡中文字幕| 亚洲人成在线播放| 美女av一区二区| 97久久久免费福利网址| 国产免费一区二区三区香蕉精| 亚洲第一综合天堂另类专| 九色精品免费永久在线| 国产精品在线看| 欧美高清videos高潮hd| www.久久久久| 国产精品爽黄69天堂a| 欧美重口另类videos人妖| 国产精品旅馆在线| 色综合久久悠悠| 欧美激情国产精品| 日韩激情av在线免费观看| 日韩黄色在线免费观看| 97视频国产在线| 国产在线一区二区三区| 久久精品国产一区二区三区| 成人免费网视频| 91成人天堂久久成人| 欧美国产乱视频| 国产一区二区三区在线播放免费观看| 欧美激情一区二区久久久| 精品国产拍在线观看| 自拍偷拍亚洲在线| 国产精品久久久久秋霞鲁丝| 久久免费国产视频| 久久精品精品电影网| 欧美日韩亚洲网| 国产精品三级在线| 久久人人97超碰精品888| 国产精品第一页在线| 欧美最顶级丰满的aⅴ艳星| 国产精品免费一区豆花| 日韩精品免费在线观看| 久久精品国产69国产精品亚洲| 欧美黑人性生活视频| 久久久久久999| 久久久久久香蕉网| 91av网站在线播放| 亚洲综合av影视| 在线观看国产成人av片| 国产精品丝袜一区二区三区| 国产一区二区在线免费| 在线播放国产精品| 欧美黑人一区二区三区| 成人国产亚洲精品a区天堂华泰| 97视频人免费观看| 亚洲国产精品久久久久秋霞蜜臀| 国产一区二区黑人欧美xxxx| 久久精品中文字幕| 狠狠躁夜夜躁久久躁别揉| 亚洲女人初尝黑人巨大| 日韩久久免费电影| 91精品久久久久久久久| 91chinesevideo永久地址| 亚洲老头老太hd| 久久久中文字幕| 国产精品极品美女粉嫩高清在线| 亚洲的天堂在线中文字幕| 亚洲国产精品99| 精品欧美激情精品一区| 亚洲欧美激情一区| 91国自产精品中文字幕亚洲| 国产不卡在线观看| 国产精品久在线观看| 亲子乱一区二区三区电影| 亚洲老头老太hd| 国产欧美一区二区三区久久人妖| 欧美精品成人91久久久久久久| 亚洲午夜女主播在线直播| 97人人模人人爽人人喊中文字| 中文欧美日本在线资源| 91国内揄拍国内精品对白| 欧美精品久久久久久久久久| 日韩av电影国产| 91福利视频在线观看| 久久国产精品久久国产精品| 国产剧情日韩欧美| 亚洲爱爱爱爱爱| 中文字幕av一区二区三区谷原希美| 庆余年2免费日韩剧观看大牛| 国产做受69高潮| 国产精品久久久久aaaa九色| 国产亚洲精品综合一区91| 人妖精品videosex性欧美| 国产综合色香蕉精品| 久久精品成人欧美大片| 国产精品第一第二| 亚洲精品98久久久久久中文字幕| 欧美肥老妇视频| 久久成人精品一区二区三区| 欧美午夜女人视频在线| 亚洲免费伊人电影在线观看av| 97在线视频免费看| 亚洲男人天堂久| 国内成人精品一区| 欧美性20hd另类| 北条麻妃99精品青青久久| 4438全国亚洲精品在线观看视频| 欧美久久久精品| 一区二区三区亚洲| www亚洲精品| 91视频国产一区| 日韩精品免费综合视频在线播放| 欧美成人亚洲成人日韩成人| 91精品国产色综合| 色偷偷av亚洲男人的天堂| 日韩av在线一区| 成人免费观看49www在线观看| 国产精品白嫩美女在线观看| 欧美在线性视频| 国产在线精品自拍| 国产视频在线观看一区二区| 国产精品爱啪在线线免费观看| 亚洲欧美国产一本综合首页| 欧美高清videos高潮hd| 91色p视频在线| 欧美国产日韩一区二区三区| 欧美俄罗斯乱妇| 久久国产精品首页| 中文字幕精品—区二区| 成人国产精品av| 91禁国产网站| 国产精品久久久久久久久久久久久| 2019中文字幕免费视频| 欧美大片在线看免费观看| 日本三级久久久| 欧美夜福利tv在线| 一区二区三区视频免费| 国产精品久久久久久久久久久久久| 国产日韩在线看片| 国模精品视频一区二区| 亚洲欧美一区二区三区久久| 亚洲男人天堂久| 亚洲免费成人av电影| 欧美精品999| 国产91色在线免费| 欧美视频在线观看 亚洲欧| 狠狠躁天天躁日日躁欧美| 国产精品视频网| 麻豆乱码国产一区二区三区| 亚洲成人1234| 久久久在线免费观看| 久久久精品999| 亚洲精品国产拍免费91在线| 欧美一乱一性一交一视频| 亚洲高清免费观看高清完整版| 91视频-88av| 色综合导航网站| 成人在线视频福利| 色婷婷久久av| 不用播放器成人网| 欧美另类高清videos| 神马国产精品影院av| 精品久久久免费| 亚洲一区二区三区在线免费观看|