1. 程式人生 > >Java多執行緒--併發集合框架概述

Java多執行緒--併發集合框架概述

最近被陸陸續續問了幾遍HashMap的實現,回答的不好,打算複習複習JDK中的集合框架,並嘗試分析其原始碼,這麼做一方面是這些類非常實用,掌握其實現能更好的優化我們的程式;另一方面是學習借鑑JDK是如何實現了這麼一套優雅高效的類庫,提升程式設計能力。

在介紹具體適合類之前,本篇文章對Java中的集合框架做一個大致描述,從一個高的角度俯視這個框架,瞭解了這個框架的一些理念與約定,會大大幫助後面分析某個具體類,讓我們開始吧。

集合框架(collections framework)

首先要明確,集合代表了一組物件(和陣列一樣,但陣列長度不能變,而集合能)。Java中的集合框架定義了一套規範,用來表示、操作集合,使具體操作與實現細節解耦。

其實說白了,可以把一個集合看成一個微型資料庫,操作不外乎“增刪改查”四種操作,我們在學習使用一個具體的集合類時,需要把這四個操作的時空複雜度弄清楚了,基本上就可以說掌握這個類了。

設計理念

主要理念用一句話概括就是:提供一套“小而美”的API。API需要對程式設計師友好,增加新功能時能讓程式設計師們快速上手。
為了保證核心介面足夠小,最頂層的介面(也就是Collection與Map介面)並不會區分該集合是否可變(mutability),是否可更改(modifiability),是否可改變大小(resizability)這些細微的差別。相反,一些操作是可選的,在實現時丟擲UnsupportedOperationException

即可表示集合不支援該操作。集合的實現者必須在文件中宣告那些操作是不支援的。

為了保證最頂層的核心介面足夠小,它們只能包含下面情況下的方法:

  1. 基本操作,像之前說的“增刪改查”
  2. There is a compelling performance reason why an important implementation would want to override it.

此外,所有的集合類都必須能提供友好的互動操作,這包括沒有繼承Collection類的陣列物件。因此,框架提供一套方法,讓集合類與陣列可以相互轉化,並且可以把Map看作成集合。

兩大基類Collection與Map

在集合框架的類繼承體系中,最頂層有兩個介面:

  • Collection表示一組純資料
  • Map表示一組key-value對

一般繼承自CollectionMap的集合類,會提供兩個“標準”的建構函式:

  • 沒有引數的建構函式,建立一個空的集合類
  • 有一個型別與基類(CollectionMap)相同的建構函式,建立一個與給定引數具有相同元素的新集合類

因為介面中不能包含建構函式,所以上面這兩個建構函式的約定並不是強制性的,但是在目前的集合框架中,所有繼承自CollectionMap的子類都遵循這一約定。

Collection

java-collection-hierarchy

如上圖所示,Collection類主要有三個介面:

  • Set表示不允許有重複元素的集合(A collection that contains no duplicate elements)
  • List表示允許有重複元素的集合(An ordered collection (also known as a sequence))
  • Queue JDK1.5新增,與上面兩個集合類主要是的區分在於Queue主要用於儲存資料,而不是處理資料。(A collection designed for holding elements prior to processing.)

Map

MapClassHierarchy

Map並不是一個真正意義上的集合(are not true collections),但是這個介面提供了三種“集合視角”(collection views ),使得可以像操作集合一樣操作它們,具體如下:

  • 把map的內容看作key的集合(map’s contents to be viewed as a set of keys)
  • 把map的內容看作value的集合(map’s contents to be viewed as a collection of values)
  • 把map的內容看作key-value對映的集合(map’s contents to be viewed as a set of key-value mappings)

總結

今天先開個頭,後面會陸陸續續來一系列乾貨,Stay Tuned。

1 2 3 4 $ java -version java version "1.7.0_71" Java(TM) SE Runtime Environment (build 1.7.0_71-b14) Java HotSpot(TM) 64-Bit Server VM (build 24.71-b01, mixed mode)

相關推薦

Java執行--併發集合框架概述

最近被陸陸續續問了幾遍HashMap的實現,回答的不好,打算複習複習JDK中的集合框架,並嘗試分析其原始碼,這麼做一方面是這些類非常實用,掌握其實現能更好的優化我們的程式;另一方面是學習借鑑JDK是如何實現了這麼一套優雅高效的類庫,提升程式設計能力。 在介紹具體適合類之

【轉】Java執行-同步集合併發集合

同步集合可以簡單地理解為通過synchronized來實現同步的集合。如果有多個執行緒呼叫同步集合的方法,它們將會序列執行。 arrayList和vector、stack Vector是執行緒安全的,原始碼中有很多的synchronized可以看出,而

Java執行--併發集合的使用之ConcurrentSkipListMap

概述       基於跳錶實現的ConcurrentNavigableMap。 1)containsKey、get、put、remove等操作的平均時間複雜度為log(n);size非固定時間操作,因非同步特性,需要遍歷所有節點才能確定size,且可能不是

Java執行之Executor框架

在前面的這篇文章中介紹了執行緒池的相關知識,現在我們來看一下跟執行緒池相關的框架--Executor。 一.什麼是Executor 1.Executor框架的兩級排程模型 在HotSpot VM的執行緒模型中,Java執行緒(java.lang.Thread)被一對一對映為本地作業系統執

Java執行-併發執行

執行緒池有了解嗎? 答: java.util.concurrent.ThreadPoolExecutor 類就是一個執行緒池。客戶端呼叫ThreadPoolExecutor.submit(Runnable task) 提交任務,執行緒池內部維護的工作者執行緒的數量就是該執行緒池的執行

Java執行-併發之synchronized 關鍵字

synchronized 關鍵字 答: 底層實現: 進入時,執行 monitorenter,將計數器 +1,釋放鎖 monitorexit 時,計數器 -1 當一個執行緒判斷到計數器為 0 時,則當前鎖空閒,可以佔用;反之,當前執行緒進入等待狀態 含義

Java執行-併發之sleep() 和 wait(n) 、 wait() 的區別

sleep() 和 wait(n) 、 wait() 的區別 答: sleep 方法:是 Thread 類的靜態方法,當前執行緒將睡眠 n 毫秒,執行緒進入阻塞狀態。當睡眠時間到了,會接觸阻塞,進入可執行狀態,等待 CPU 的到來。睡眠不釋放鎖(如果有的話) wai

Java執行-併發執行產生死鎖的4個必要條件?如何避免死鎖?

多執行緒產生死鎖的4個必要條件? 答: 互斥條件:一個資源每次只能被一個執行緒使用 請求與保持條件:一個執行緒因請求資源而阻塞時,對已獲得的資源保持不放 不剝奪條件:程序已經獲得的資源,在未使用完之前,不能強行剝奪 迴圈等待條件:若干執行緒之間形成一種頭

Java執行-併發執行和程序的區別

執行緒和程序的區別 答: 程序是一個“執行中的程式”,是系統進行資源分配和排程的一個獨立單位 執行緒是程序的一個實體,一個程序中擁有多個執行緒,執行緒之間共享地址空間和其他資源(所以通訊和同步等操作執行緒比程序更加容易) 執行緒上下文的切換比程序上下文切換要快

Java執行-併發之如何制定執行執行順序?

文章目錄 如何讓10個執行緒按照順序列印0123456789? 程式碼如下: 1.建立一個鎖物件類 2.建立一個執行緒類 3.測試類 如何讓10個執行緒按照順序列印012

Java執行併發總結】Thread類的常用方法(join、yield等)---執行的基礎操作篇

 啟動(start)   最基本的操作,呼叫Runnable中的run方法,無返回值。 new Thread(new Test()).start(); 休眠(sleep)  使當前執行緒休眠一段時間,預設為毫秒級,最高可以精確到納秒,呼叫的方法為slee

java 執行併發實質

首先我們都知道多執行緒在獲取共享資源時,往往會出現意想不到的結果,這是為什麼呢?執行緒獲取共享資源的過程如下圖: 首先我們需要了解jvm記憶體結構,在這裡不過多說明,由上圖我們可以知道,在jvm記憶體中分為獨立記憶體和共享記憶體,獨立記憶體是我們每個執行緒獨有的資訊,而

JAVA執行併發Demo

一個最簡單的多執行緒併發demo: 主函式: public class multithreadReq { private static final int THREADNUM = 5;/

一、Java執行併發同步之Semaphore

概念 Semaphore是一種在多執行緒環境下使用的設施,該設施負責協調各個執行緒,用來管理資源,以保證它們能夠正確、合理的使用公共資源的設施,也是作業系統中用於控制程序同步互斥的量。用我們常見的說法就是用來控制併發數。 訊號量是一個非負整數 。 業務場景 以售

Java執行/併發20、Future實現類:FutureTask

FutureTask是future的實現類,它同時實現了兩個介面:Runnable和Future,所以它既可以作為Runnable被執行緒執行,又可以作為Future得到Callable的返回值。 因此我們可以: - 呼叫FutureTask物件的ru

二、Java執行併發同步之CyclicBarrier

概述 CyclicBarrier:可迴圈屏障,允許一組執行緒全部等待的同步輔助工具。一組執行緒互相等待,直到所有執行緒都到達某個公共屏障點(也可以叫同步點) 。它可以在等待執行緒之後重新使用。這個屏障之所以用迴圈修飾,是因為在所有的執行緒釋放彼此之後,這個屏障是

java執行併發系列之閉鎖(Latch)和柵欄(CyclicBarrier)

-閉鎖(Latch) 閉鎖(Latch):一種同步方法,可以延遲執行緒的進度直到執行緒到達某個終點狀態。通俗的講就是,一個閉鎖相當於一扇大門,在大門開啟之前所有執行緒都被阻斷,一旦大門開啟所有執行緒都將通過,但是一旦大門開啟,所有執行緒都通過了,那麼這個閉鎖的狀態就失效了,門

入坑JAVA執行併發(六)死鎖

  在多執行緒的中,因為要保證執行緒安全,需要對一些操作進行加鎖,但是如果操作不當,會造成死鎖,導致程式無法執行下去。   形成死鎖的場景:如果有兩個執行緒,執行緒1和執行緒2,執行緒1執行,獲得鎖A,執行緒2執行,獲得B,執行緒1等待鎖B的釋放,執行緒2等待

入坑JAVA執行併發(五)生產者消費者模式

生產者消費者模式對於理解多執行緒是一個很經典,也很好的例子 資源類: class Resource{ //資源初始化個數 private int init; //資源最大個數 private int Max; p

入坑JAVA執行併發(二)執行的生命週期和常用方法

執行緒的生命週期大致分為五種狀態: 1. 新建: 新建一個執行緒物件。 2.可執行: 啟動執行緒,呼叫start方法或者呼叫執行緒池的excute方法等,此時執行緒會進入可執行執行緒池中,等待獲取CPU的時間片。 3.執行 執行狀態,也就