這將是我寫過的博客當中最沒有深度的一篇,見諒
本文分爲六個模塊,分別爲進程和線程,線程對象,線程同步,線程死鎖,線程協調,高級併發對象
1. 進程和線程
串行 | 並行 |
---|---|
串行是指多個任務完成時,各個任務按順序執行,完成最後一個才能進行下一個 | 並行指的是多個任務可以同時執行 |
並行 | 併發 |
---|---|
同時進行兩個操作,作用於不同對象 | 同時進行兩個操作,作用於同一個對象 |
進程 | 線程 |
---|---|
具有獨立的執行環境,每個進程都有完整的存儲空間 | 相當於進程的子系 |
2.線程對象
有三種實現方式(此處不詳細講解):
1:實現 Runnable接口
2: 繼承Thread類
3:繼承Callable類
yield方法 | sleep方法 | join方法 |
---|---|---|
Thread類中提供了一種禮讓方法,使用yield()方法表示,它只是給當前正處於運行狀態下的線程一個提醒,告知它可以將資源禮讓給其他線程,但這僅僅是一種暗示,沒有任何一種機制保證當前線程會將資源禮讓 | Thread.sleep使當前線程在指定時間段內暫停執行。這是使處理器時間可用於應用程序的其他線程或計算機系統上可能正在運行的其他應用程序的有效方法 | join方法允許一個線程等待另一線程的完成。如果t是Thread正在執行其線程的對象,t.join();導致當前線程暫停執行,直到t的線程終止。 |
3.線程同步
1. 線程衝突
當在不同線程中運行作用於相同數據的兩個操作時,就會發生干擾。這意味着這兩個操作由多個步驟組成,並且步驟順序重疊。
-
檢索的當前值c。
-
將檢索到的值增加1。
-
將增加的值存儲回c。
2. 同步語句
Java編程語言提供了兩種基本的同步習慣用法:同步語句(synchronized statements )和同步方法(synchronized
methods )。
創建同步代碼的一種方法是使用同步語句。與同步方法不同,同步語句必須指定提供內部鎖的對象。
同步語句對於通過細粒度同步提高併發性很有用。
4 .線程死鎖
死鎖是一種特定的程序狀態,在實體之間,由於循環依賴導致彼此一直處於等待之中,沒有任何個體可以繼續前進。
死鎖不僅僅在線程之間會發生,存在資源獨佔的進程之間同樣也可能出現死鎖。通常來說,我們大多是聚焦在多線程場景中的死鎖,指兩個或多個線程之間,由於互相持有對方需要的鎖,互相等待,而永久處於阻塞狀態
5.線程協調
這裏我就根據我的簡單理解寫了
wait方法 | notify方法 |
---|---|
等待 | 喚醒 |
6.高級併發對象
鎖對象
同步代碼依賴於一種簡單的可重入鎖。這種鎖易於使用,但有很多限制。java.util.concurrent.locks軟件包支持更復雜的鎖定習慣用法
。
Lock對象的工作方式非常類似於同步代碼所使用的隱式鎖。與隱式鎖一樣,一次只能有一個線程擁有一個Lock對象。Lock對象還wait/notify通過其關聯的Condition對象支持一種機制
線程池
Java中創建和銷燬一個線程是比較昂貴的操作,需要系統調用。頻繁創建和銷燬線程會影響系統性能。
使用線程池帶來以下好處:
- 降低資源的消耗。線程本身是一種資源,創建和銷燬線程會有CPU開銷;創建的線程也會佔用一定的內存。
- 提高任務執行的響應速度。任務執行時,可以不必等到線程創建完之後再執行。
- 提高線程的可管理性。線程不能無限制地創建,需要進行統一的分配、調優和監控。