咱們在67節和68節實現了線程的一些基本協做機制,那是利用基本的wait/notify實現的,咱們提到,Java併發包中有一些專門的同步工具類,本節,咱們就來探討它們。 咱們要探討的工具類包括: 讀寫鎖ReentrantReadWriteLock 信號量Se...java
本節探討定時任務,定時任務的應用場景是很是多的,好比: 鬧鐘程序或任務提醒,指定時間叫牀或在指定日期提醒還信用卡 監控系統,每隔一段時間採集下系統數據,對異常事件報警 統計系統,通常凌晨必定時間統計昨日的各類數據指標 在Java中,有兩種方式實現定時任務:...算法
上節,咱們提到,在異步任務程序中,一種常見的場景是,主線程提交多個異步任務,而後但願有任務完成就處理結果,而且按任務完成順序逐個處理,對於這種場景,Java併發包提供了一個方便的方法,使用CompletionService,這是一個接口,它的實現類是Execu...數據庫
Java併發包提供了一套框架,大大簡化了執行異步任務所需的開發,本節咱們就來初步探討這套框架。 在以前的介紹中,線程Thread既表示要執行的任務,又表示執行的機制,而這套框架引入了一個"執行服務"的概念,它將"任務的提交&quo...設計模式
上節,咱們初步探討了Java併發包中的任務執行服務,實際中,任務執行服務的主要實現機制是線程池,本節,咱們就來探討線程池。 基本概念 線程池,顧名思義,就是一個線程的池子,裏面有若干線程,它們的目的就是執行提交給線程池的任務,執行完一個任務後不會退出,而是繼續...數組
本節,咱們來探討Java併發包中的各類隊列。Java併發包提供了豐富的隊列類,能夠簡單分爲: 無鎖非阻塞併發隊列:ConcurrentLinkedQueue和ConcurrentLinkedDeque 普通阻塞隊列:基於數組的ArrayBlockingQue...安全
上節咱們介紹了ConcurrentHashMap,ConcurrentHashMap不能排序,容器類中能夠排序的Map和Set是TreeMap和TreeSet,但它們不是線程安全的。Java併發包中與TreeMap/TreeSet對應的併發版本是Concurr...數據結構
本節介紹一個經常使用的併發容器 - ConcurrentHashMap,它是HashMap的併發版本,與HashMap相比,它有以下特色: 併發安全 直接支持一些原子複合操做 支持高併發、讀操做徹底並行、寫操做支持必定程度的並行 與同步容器Collections...多線程
本節以及接下來的幾節,咱們探討Java併發包中的容器類。本節先介紹兩個簡單的類CopyOnWriteArrayList和CopyOnWriteArraySet,討論它們的用法和實現原理。它們的用法比較簡單,咱們須要理解的是它們的實現機制,Copy-On-Wri...併發
上節咱們介紹了顯式鎖,本節介紹關聯的顯式條件,介紹其用法和原理。顯式條件也能夠被稱作條件變量、條件隊列、或條件,後文咱們可能會交替使用。 用法 基本概念和方法 鎖用於解決競態條件問題,條件是線程間的協做機制。顯式鎖與synchronzied相對應,而顯式條件與...框架
在66節,咱們介紹了利用synchronized實現鎖,咱們提到了synchronized的一些侷限性,本節,咱們探討Java併發包中的顯式鎖,它能夠解決synchronized的限制。 Java併發包中的顯式鎖接口和類位於包java.util.concurr...
從本節開始,咱們探討Java併發工具包java.util.concurrent中的內容,本節先介紹最基本的原子變量及其背後的原理和思惟。 原子變量 什麼是原子變量?爲何須要它們呢? 在理解synchronized一節,咱們介紹過一個Counter類,使用sy...
本節主要討論一個問題,如何在Java中取消或關閉一個線程? 取消/關閉的場景 咱們知道,經過線程的start方法啓動一個線程後,線程開始執行run方法,run方法運行結束後線程退出,那爲何還須要結束一個線程呢?有多種狀況,好比說: 不少線程的運行模式是死循...
本節繼續上節的內容,探討如何使用wait/notify實現更多的協做場景。 同時開始 同時開始,相似於運動員比賽,在聽到比賽開始槍響後同時開始,下面,咱們模擬下這個過程,這裏,有一個主線程和N個子線程,每一個子線程模擬一個運動員,主線程模擬裁判,它們協做的共享變...
上節介紹了多線程之間競爭訪問同一個資源的問題及解決方案synchronized,咱們提到,多線程之間除了競爭,還常常須要相互協做,本節就來介紹Java中多線程協做的基本機制wait/notify。 都有哪些場景須要協做?wait/notify是什麼?如何使用?...
上節咱們提到了多線程共享內存的兩個問題,一個是競態條件,另外一個是內存可見性,咱們提到,解決這兩個問題的一個方案是使用synchronized關鍵字,本節就來討論這個關鍵字。 用法 synchronized能夠用於修飾類的實例方法、靜態方法和代碼塊,咱們分別來看...
以前咱們介紹了Map接口的兩個實現類HashMap和TreeMap,本節來介紹另外一個實現類LinkedHashMap。它是HashMap的子類,但能夠保持元素按插入或訪問有序,這與TreeMap按鍵排序不一樣。 按插入有序容易理解,按訪問有序是什麼意思呢?這兩個...
上節咱們提到,若是須要一個Map的實現類,而且鍵的類型爲枚舉類型,可使用HashMap,但應該使用一個專門的實現類EnumMap。 爲何要有一個專門的類呢?咱們以前介紹過枚舉的本質,主要是由於枚舉類型有兩個特徵,一是它可能的值是有限的且預先定義的,二是枚舉...
上節介紹了EnumMap,本節介紹一樣針對枚舉類型的Set接口的實現類EnumSet。與EnumMap相似,之因此會有一個專門的針對枚舉類型的實現類,主要是由於它能夠很是高效的實現Set接口。 以前介紹的Set接口的實現類HashSet/TreeSet,它們內...
從38節到51節,咱們介紹的都是具體的容器類,上節咱們提到,全部具體容器類其實都不是從頭構建的,它們都繼承了一些抽象容器類。這些抽象類提供了容器接口的部分實現,方便了Java具體容器類的實現,理解它們有助於進一步理解具體容器類。 此外,經過繼承抽象類,自定義的...
以前幾節介紹了各類具體容器類和抽象容器類,上節咱們提到,Java中有一個類Collections,提供了不少針對容器接口的通用功能,這些功能都是以靜態方法的方式提供的。 都有哪些功能呢?大概能夠分爲兩類: 對容器接口對象進行操做 返回一個容器接口對象 對...
上節咱們提到,類Collections中大概有兩類功能,第一類是對容器接口對象進行操做,第二類是返回一個容器接口對象,上節咱們介紹了第一類,本節咱們介紹第二類。 第二類方法大概能夠分爲兩組: 接受其餘類型的數據,轉換爲一個容器接口,目的是使其餘類型的數據更爲...
從38節到54節,咱們介紹了多種容器類,本節進行簡要總結,咱們主要從三個角度進行總結: 用法和特色 數據結構和算法 設計思惟和模式 用法和特色 咱們在52節展現過一張圖,其中包含了容器類主要的接口和類,咱們仍是用這個圖總結一下: 容器類有兩個根接口,分...
咱們在平常電腦操做中,接觸和處理最多的,除了上網,大概就是各類各樣的文件了,從本節開始,咱們就來探討文件處理,本節主要介紹文件有關的一些基本概念和常識,Java中處理文件的基本思路和類結構,以及接來下章節的安排思路。 基本概念和常識 二進制思惟 爲了透徹理解文...
本節咱們介紹在Java中如何以二進制字節的方式來處理文件,上節咱們提到Java中有流的概念,以二進制方式讀寫的主要流有: InputStream/OutputStream: 這是基類,它們是抽象類。 FileInputStream/FileOutputStr...
上節咱們介紹瞭如何以字節流的方式處理文件,咱們提到,對於文本文件,字節流沒有編碼的概念,不能按行處理,使用不太方便,更適合的是使用字符流,本節就來介紹字符流。 咱們首先簡要介紹下文本文件的基本概念、與二進制文件的區別、編碼、以及字符流和字節流的區別,而後咱們介...
前面兩節咱們介紹瞭如何經過流的方式讀寫文件內容,本節咱們介紹文件元數據和目錄的一些操做。 文件和目錄操做最終是與操做系統和文件系統相關的,不一樣系統的實現是不同的,但Java中的java.io.File類提供了統一的接口,底層它會經過本地方法調用操做系統和文件...
57節介紹了字節流, 58節介紹了字符流,它們都是以流的方式讀寫文件,流的方式有幾個限制: 要麼讀,要麼寫,不能同時讀和寫 不能隨機讀寫,只能從頭讀到尾,且不能重複讀,雖然經過緩衝能夠實現部分重讀,可是有限制 Java中還有一個類RandomAccess...
本節介紹內存映射文件,內存映射文件不是Java引入的概念,而是操做系統提供的一種功能,大部分操做系統都支持。 咱們先來介紹內存映射文件的基本概念,它是什麼,能解決什麼問題,而後咱們介紹如何在Java中使用,咱們會設計和實現一個簡單的、持久化的、跨程序的消息隊列...
在前面幾節,咱們在將對象保存到文件時,使用的是DataOutputStream,從文件讀入對象時,使用的是DataInputStream, 使用它們,須要逐個處理對象中的每一個字段,咱們提到,這種方式比較囉嗦,Java中有一種更爲簡單的機制,那就是序列化。 簡單...