JUC
一、什么是JUC
在Java 5.0 提供了java.util.concurrent(簡稱JUC )包,在此包中增加了在并發編程中很常用的實用工具類,用于定義類似于線程的自定義子系統,包括線程池、異步IO 和輕量級任務框架。提供可調的、靈活的線程池。還提供了設計用于多線程上下文中Collection 實現等。
二、進程和線程
1.進程與線程(QQ音樂(這是一個進程)與評論+播放歌曲(這是兩個線程))
- 進程:進程是一個具有一定獨立功能的程序關于某個數據集合的一次運行活動。它是操作系統動態執行的基本單元,在傳統的操作系統中,進程既是基本的分配單元,也是基本的執行單元。
- 線程:通常在一個進程中可以包含若干個線程,當然一個進程中至少有一個線程,不然沒有存在的意義。線程可以利用進程所擁有的資源,在引入線程的操作系統中,通常都是把進程作為分配資源的基本單位,而把線程作為獨立運行和獨立調度的基本單位,由于線程比進程更小,基本上不擁有系統資源,故對它的調度所付出的開銷就會小得多,能更高效的提高系統多個程序間并發執行的程度。
2.線程的狀態
- wait狀態和block狀態的區別
WAITING狀態
當前線程調用object.wait方法后,釋放對象鎖,這個狀態就是WAITING狀態,線程處于等待隊列,等待其他線程同一個對象調用notify或者notifyAll方法。
BLOCKED狀態
在調用notify或者notifyAll方法后,調用wait的等待線程不會立刻從等待隊列返回,而是從等待隊列移動到同步隊列,準備競爭對象監視器的這種狀態就是BLOCKED,換句話說就是如果同時有不止一個線程競爭對象監視器,那么這種狀態就是對象監視器。
也就是說只有synchronized會導致線程進入Blocked狀態,Waiting狀態只能進入Blocked狀態,獲取鎖之后才能恢復執行。
3.等待隊列
調用obj的wait(), notify()方法前,必須獲得obj鎖,也就是必須寫在synchronized(obj) 代碼段內。 1.線程1獲取對象A的鎖,正在使用對象A。 2.線程1調用對象A的wait()方法。 3.線程1釋放對象A的鎖,并馬上進入等待隊列。 4.鎖池里面的對象爭搶對象A的鎖。 5.線程5獲得對象A的鎖,進入synchronized塊,使用對象A。 6.線程5調用對象A的notifyAll()方法,喚醒所有線程,所有線程進入同步隊列。若線程5調用對象A的notify()方法, 則喚醒一個線程,不知道會喚醒誰,被喚醒的那個線程進入同步隊列。 7.notifyAll()方法所在synchronized結束,線程5釋放對象A的鎖。 8.同步隊列的線程爭搶對象鎖,但線程1什么時候能搶到就不知道了。三、并行和并發
并發:同一時刻多個線程在訪問同一個資源,多個線程對一個點(搶票)
并行:多項工作一起執行,之后再匯總(例子:泡方便面,電水壺燒水)
本文轉載
總結
- 上一篇: Java8新特性之函数式接口
- 下一篇: 互联网日报 | 7月8日 星期四 | 小