最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時(shí)間:2017年12月22日 08:39:00   作者:光與熱  
這篇文章主要介紹了java集合框架線程同步代碼詳解,具有一定借鑒價(jià)值,需要的朋友可以參考下。

List接口的大小可變數(shù)組的實(shí)現(xiàn)。實(shí)現(xiàn)了所有可選列表操作,并允許包括null在內(nèi)的所有元素。除了實(shí)現(xiàn)List接口外,此類(lèi)還提供一些方法來(lái)操作內(nèi)部用來(lái)存儲(chǔ)列表的數(shù)組的大小。(此類(lèi)大致上等同于Vector類(lèi),除了此類(lèi)是不同步的。)size、isEmpty、get、set、iterator和listIterator操作都以固定時(shí)間運(yùn)行。add操作以分?jǐn)偟墓潭〞r(shí)間運(yùn)行,也就是說(shuō),添加n個(gè)元素需要O(n)時(shí)間。其他所有操作都以線性時(shí)間運(yùn)行(大體上講)。與用于LinkedList實(shí)現(xiàn)的常數(shù)因子相比,此實(shí)現(xiàn)的常數(shù)因子較低。每個(gè)ArrayList實(shí)例都有一個(gè)容量。該容量是指用來(lái)存儲(chǔ)列表元素的數(shù)組的大小。它總是至少等于列表的大小。隨著向ArrayList中不斷添加元素,其容量也自動(dòng)增長(zhǎng)。并未指定增長(zhǎng)策略的細(xì)節(jié),因?yàn)檫@不只是添加元素會(huì)帶來(lái)分?jǐn)偣潭〞r(shí)間開(kāi)銷(xiāo)那樣簡(jiǎn)單。在添加大量元素前,應(yīng)用程序可以使用ensureCapacity操作來(lái)增加ArrayList實(shí)例的容量。這可以減少遞增式再分配的數(shù)量。

注意,此實(shí)現(xiàn)不是同步的。

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

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

此類(lèi)的iterator和listIterator方法返回的迭代器是快速失敗的:在創(chuàng)建迭代器之后,除非通過(guò)迭代器自身的remove或add方法從結(jié)構(gòu)上對(duì)列表進(jìn)行修改,否則在任何時(shí)間以任何方式對(duì)列表進(jìn)行修改,迭代器都會(huì)拋出ConcurrentModificationException。因此,面對(duì)并發(fā)的修改,迭代器很快就會(huì)完全失敗,而不是冒著在將來(lái)某個(gè)不確定時(shí)間發(fā)生任意不確定行為的風(fēng)險(xiǎn)。

注意,迭代器的快速失敗行為無(wú)法得到保證,因?yàn)橐话銇?lái)說(shuō),不可能對(duì)是否出現(xiàn)不同步并發(fā)修改做出任何硬性保證??焖偈〉鲿?huì)盡最大努力拋出ConcurrentModificationException。因此,為提高這類(lèi)迭代器的正確性而編寫(xiě)一個(gè)依賴于此異常的程序是錯(cuò)誤的做法:迭代器的快速失敗行為應(yīng)該僅用于檢測(cè)bug。

如上所示,現(xiàn)在建立一個(gè)list集合,一個(gè)線程對(duì)集合進(jìn)行寫(xiě)入操作,一個(gè)線程進(jìn)行刪除操作

import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.Random;
public class MyArrayList {
	/** 
   * 創(chuàng)建一個(gè)列表,一個(gè)線程進(jìn)行寫(xiě)入,一個(gè)線程讀取 iterator 和 listIterator 方法返回的迭代器是快速失敗的 
   */
	public void readWrite() {
		List<Integer> nums = new ArrayList<Integer>();
		List<Integer> synNums = Collections.synchronizedList(nums);
		//啟動(dòng)寫(xiě)入線程 
		new WriteListThread(synNums).start();
		//啟動(dòng)刪除線程 
		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;
	}
	// 不停寫(xiě)入元素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;
	}
	// 刪除第一個(gè)元素 
	public void run() {
		while (true) {
			try{
				System.out.println(Thread.currentThread().getName()+”:”+nums.remove(0));
			}
			catch(Exception e){
				continue ;
			}
		}
	}
}

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

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 {
	/** 
   * 創(chuàng)建一個(gè)列表,一個(gè)線程進(jìn)行寫(xiě)入,一個(gè)線程讀取 iterator 和 listIterator 方法返回的迭代器是快速失敗的 
   */
	public void readWrite() {
		List<Integer> nums = new ArrayList<Integer>();
		List<Integer> synNums = Collections.synchronizedList(nums);
		//啟動(dòng)寫(xiě)入線程 
		new WriteListThread(synNums).start();
		//啟動(dòng)刪除線程 
		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;
	}
	// 不停寫(xiě)入元素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;
	}
	// 刪除第一個(gè)元素 
	public void run() {
		while (true) {
			try{
				System.out.println(Thread.currentThread().getName()+":"+nums.remove(0));
			}
			catch(Exception e){
				continue ;
			}
		}
	}
}

可見(jiàn)對(duì)于集合同步操作,使用Collections的同步包裝工具類(lèi),還需要對(duì)非原子操作用戶還需要手動(dòng)進(jìn)行同步

如下所示,加一個(gè)線程,對(duì)集合進(jìn)行讀取

class ReadListThread extends Thread {
	private List<Integer> nums;
	public ReadListThread(List<Integer> nums) {
		super(“ReadListThread”);
		this.nums = nums;
	}
	// 不停讀取元素,非原子操作,則需要手動(dòng)加上鎖 
	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();
					}
				}
			}
		}
	}
}

總結(jié)

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

相關(guān)文章

  • Java?新特性之Option示例詳解

    Java?新特性之Option示例詳解

    使用Optional開(kāi)發(fā)時(shí)要注意正確使用Optional的“姿勢(shì)”,特別注意不要使用3.2節(jié)提到的錯(cuò)誤示范,謹(jǐn)慎使用isPresent()和get()方法,盡量多使用map()、filter()、orElse()等方法來(lái)發(fā)揮Optional的作用,對(duì)Java??Option相關(guān)知識(shí)感興趣的朋友一起看看吧
    2024-02-02
  • Java+opencv3.2.0實(shí)現(xiàn)模板匹配

    Java+opencv3.2.0實(shí)現(xiàn)模板匹配

    這篇文章主要為大家詳細(xì)介紹了Java+opencv3.2.0實(shí)現(xiàn)模板匹配的相關(guān)資料,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • SpringBoot整合RabbitMQ示例詳解

    SpringBoot整合RabbitMQ示例詳解

    這篇文章主要介紹了SpringBoot整合RabbitMQ示例詳解,RabbitMQ是一個(gè)實(shí)現(xiàn)了AMQP高級(jí)消息隊(duì)列協(xié)議的消息隊(duì)列服務(wù),用Erlang語(yǔ)言。是面向消息的中間件,需要的朋友可以參考下
    2023-07-07
  • Java之字節(jié)碼以及優(yōu)勢(shì)案例講解

    Java之字節(jié)碼以及優(yōu)勢(shì)案例講解

    這篇文章主要介紹了Java之字節(jié)碼以及優(yōu)勢(shì)案例講解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08
  • SpringBoot整合MongoDB實(shí)現(xiàn)事務(wù)管理

    SpringBoot整合MongoDB實(shí)現(xiàn)事務(wù)管理

    Spring Boot是一種快速開(kāi)發(fā)Spring應(yīng)用的方式,它提供了大量的自動(dòng)配置和默認(rèn)設(shè)置,以簡(jiǎn)化開(kāi)發(fā)流程,MongoDB是一個(gè)基于文檔的NoSQL數(shù)據(jù)庫(kù),本文將介紹如何在Spring Boot應(yīng)用中整合MongoDB,并實(shí)現(xiàn)事務(wù)管理,需要的朋友可以參考下
    2024-07-07
  • 詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類(lèi)型

    詳解SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類(lèi)型

    本文主要介紹了SpringBoot使用RedisTemplate操作Redis的5種數(shù)據(jù)類(lèi)型,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-03-03
  • j2ee之AJAX二級(jí)聯(lián)動(dòng)效果

    j2ee之AJAX二級(jí)聯(lián)動(dòng)效果

    這篇文章主要為大家詳細(xì)介紹了j2ee之AJAX二級(jí)聯(lián)動(dòng)效果的實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-08-08
  • 淺談@RequestParam(required = true)的誤區(qū)

    淺談@RequestParam(required = true)的誤區(qū)

    這篇文章主要介紹了@RequestParam(required = true)的誤區(qū),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-11-11
  • Mybatis批量插入Oracle數(shù)據(jù)的方法實(shí)例

    Mybatis批量插入Oracle數(shù)據(jù)的方法實(shí)例

    在開(kāi)發(fā)中或多或少都會(huì)遇到數(shù)據(jù)批量插入的功能,最近我在做項(xiàng)目的過(guò)程中就遇到了這樣一個(gè)問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Mybatis批量插入Oracle數(shù)據(jù)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Java 集合去重的三種方法

    Java 集合去重的三種方法

    本主要介紹了Java 集合去重的三種方法,包含HashSet,Stream API和手動(dòng)遍歷并使用Map三種,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2024-07-07

最新評(píng)論

池州市| 伊川县| 南部县| 河西区| 乐安县| 宁蒗| 沧州市| 临海市| 奉贤区| 那曲县| 东阳市| 南京市| 米脂县| 临泉县| 繁峙县| 大渡口区| 加查县| 田阳县| 三原县| 祁门县| 福海县| 北碚区| 台东市| 安溪县| 牟定县| 赞皇县| 洞头县| 许昌市| 周至县| 华亭县| 南城县| 翁源县| 辛集市| 乌拉特后旗| 新河县| 盐源县| 互助| 新余市| 临夏市| 怀仁县| 济阳县|