目錄
一、線程和進程的區別?
二、并行和并發的區別??
三、線程創建的方式有哪些??
3.1、繼承Thread類
3.2、實現Runnable接口
3.3、實現Callable接口
3.4、線程池
四、Runnable和Callable的區別?
五、在啟動線程的時候,可以使用run方法嗎?run()和start()有什么區別?
六、線程包含了哪些狀態?狀態之間是如何變化的?
七、新建T1、T2、T3三個線程,如何保證它們按順序執行?
八、notify和notifyAll有什么區別?
九、Java中wait方法和sleep方法有什么不同?
十、如何停止一個正在運行的線程?
十一、synchronized關鍵字的底層原理
十二、Monitor實現的鎖屬于重量級鎖。你了解過鎖升級嗎?
十三、談談JMM(Java內存模型)
十四、CAS
十五、樂觀鎖和悲觀鎖?
十六:談談你對volatile的理解?
十七、AQS?
?十八、ReentrantLock的實現原理
十九、synchronized和Lock有什么區別?
二十、死鎖產生的條件?
二十一、如何進行死鎖診斷?
二十二、ConcurrentHashMap
二十三、Java程序中怎么保證多線程的執行安全?(導致并發程序出現問題的根本原因是什么)
二十四、線程池的核心參數(線程池的執行原理)
二十五、線程池中有哪些常見的阻塞隊列
二十六、如何確定核心線程數
二十七、線程池的種類有哪些
二十八、為什么不建議Executors創建線程池
一、線程和進程的區別?
進程:
- 程序由指令和數據組成,但這些指令要運行,數據要讀寫,就必須將指令加載至CPU,數據加載至內存。在指令運行過程中還需要用到磁盤、網絡等設備。進程就是用來加載指令、管理內存、管理IO的
?- 當一個程序被運行,從磁盤加載這個程序的代碼至內存,這時就開啟了一個進程。
?- 進程就可以視為程序的一個實例。大部分程序可以同時運行多個實例進程(例如記事本、畫圖、瀏覽器等),也有的程序只能啟動一個實例進程(例如網易云音樂、360安全衛士等)
線程:?
一個進程之內可以分為一到多個線程。
一個線程就是一個指令流,將指令流中的一條條指令以一定的順序交給CPU執行
Java中,線程作為最小調度單位,進程作為資源分配的最小單位。在windows中進程是不活動的,只是作為線程的容器
?
二、并行和并發的區別??
并發是指系統具有處理多個任務的能力,但這并不意味著這些任務同時執行。在單核CPU的環境下,CPU通過在任務之間迅速切換(上下文切換),給人一種似乎是同時處理多個任務的錯覺。因此,并發關注的是多個任務的啟動、執行和完成的順序,使得多個任務看似在“同時”執行,實際上從宏觀角度是的,但從微觀角度看,這些任務可能并沒有在同一時刻被處理。
?并行處理是指多個處理器或多核處理器同時處理多個任務。在這種情況下,任務確實是在同一時刻被執行。并行執行的目的是通過同時使用多個計算資源來減少程序的執行時間。它適用于那些可以被分解為可以獨立執行的多個子任務的問題。
簡單來說:
三、線程創建的方式有哪些??
3.1、繼承Thread類
3.2、實現Runnable接口
3.3、實現Callable接口
3.4、線程池
四、Runnable和Callable的區別?
五、在啟動線程的時候,可以使用run方法嗎?run()和start()有什么區別?
六、線程包含了哪些狀態?狀態之間是如何變化的?
線程的狀態可以參考JDK中的Thread類中的枚舉State
七、新建T1、T2、T3三個線程,如何保證它們按順序執行?
八、notify和notifyAll有什么區別?
九、Java中wait方法和sleep方法有什么不同?
十、如何停止一個正在運行的線程?
十一、synchronized關鍵字的底層原理
十二、Monitor實現的鎖屬于重量級鎖。你了解過鎖升級嗎?
十三、談談JMM(Java內存模型)
十四、CAS
CAS全程是:Compare And Swap(比較再交換),它體現的一種樂觀鎖的思想,在無鎖情況下保證線程操作共享數據的原子性。
?在JUC包下實現的很多類都用到了CAS操作
比如: ?AbstractQueuedSynchronizer(AQS框架)、AtomicXXX類
CAS數據交換流程:?
一個當前內存值V、舊的預期值A、即將更新的值B,當且僅當舊的預期值A和內存值V相同時,將內存值修改為B并返回ture,否則什么都不做,并返回false。如果CAS操作失敗,通過自旋的方式等待并再次嘗試,直到成功
十五、樂觀鎖和悲觀鎖?
樂觀鎖:
它假設不會產生沖突,先去嘗試執行某項操作,失敗了再進行其他處理(一般都是不斷循環重試)。這種鎖不會阻斷其他線程,也不涉及上下文切換,性能開銷小。代表實現是:CAS
悲觀鎖:
它假設一定會發生沖突,因此獲取到鎖之后會阻塞其他等待線程。這樣做的好處是簡單安全,但是掛起線程和回復線程都需要轉入內核態進行,這樣做的話會帶來很大的性能開銷。悲觀鎖的代表是synchronized。然而在真實環境中,大部分時候都不會產生沖突。
十六:談談你對volatile的理解?
總結:
十七、AQS?
全稱是 AbstractQueueSynchronizer,即抽象隊列同步器。它是構建鎖或者其他同步組件的基礎框架
AQS基本工作機制:?
在AQS內部有一個屬性state,這個state就相當于一個資源,默認是0(無鎖狀態),如果隊列中的有一個線程修改成功了state為1,則當前線程就相當于獲取了資源
QS內部維護了一個先進先出的雙向隊列,隊列中存儲的排隊的線程
在對state修改的時候使用的CAS操作,保證多個線程修改的情況下原子性
AQS可以是公平鎖,也可以是非公平鎖
公平鎖是指各個線程在加鎖前先檢查有無排隊的隊列,按排隊順序取獲得鎖。(新的線程到隊列中等待,只讓隊列中的head線程獲取鎖,是公平鎖)
非公平鎖是指線程加鎖前不考慮排隊問題,直接嘗試獲取鎖,獲取不到再去隊尾排隊。值得注意的是,在AQS的實現中,一旦線程進入排隊隊列,即使是非公平鎖,線程也需要乖乖排隊(新的線程與隊列中的線程共同來搶資源,是非公平鎖)
?十八、ReentrantLock的實現原理
ReentrantLock 內部有兩個內部類,分別是 FairSync 和 NonFairSync,對應公平鎖和非公平鎖。他們都繼承自?Sync。Sync 又繼承自AQS。
總結:
十九、synchronized和Lock有什么區別?
二十、死鎖產生的條件?
二十一、如何進行死鎖診斷?
二十二、ConcurrentHashMap
總結:
二十三、Java程序中怎么保證多線程的執行安全?(導致并發程序出現問題的根本原因是什么)
volatile加在共享變量上!!
總結:
二十四、線程池的核心參數(線程池的執行原理)
二十五、線程池中有哪些常見的阻塞隊列
二十六、如何確定核心線程數
二十七、線程池的種類有哪些
總結: