1.什麼是進程?
是一個具有一定獨立功能的程序在一個數據集上的一次動態執行的過程,是操作系統進行資源分配和調度的一個獨立單位,是應用程序運行的載體。
2.什麼是線程?
線程是操作系統能夠進行運算調度的最小單位。
它被包含在進程之中,是進程中的實際運作單位。
一條線程指的是進程中一個單一順序的控制流,一個進程中可以並發多個線程,每條線程並行執行不同的任務。
3.進程和線程的區別?
進程和線程的主要差別在於它們是不同的操作系統資源管理方式。
進程有獨立的地址空間,一個進程崩潰後,在保護模式下不會對其它進程產生影響。
線程只是一個進程中的不同執行路徑。線程有自己的堆棧和局部變數,但線程之間沒有單獨的地址空間,一個線程死掉就等於整個進程死掉,所以多進程的程序要比多線程的程序健壯,但在進程切換時,耗費資源較大,效率要差一些。
但對於一些要求同時進行並且又要共享某些變數的並發操作,只能用線程,不能用進程。
4.多線程和單線程有什麼區別?
單線程程序:程序執行過程中只有一個有效操作的序列,不同操作之間都有明確的執行先後順序,容易出現代碼阻塞
多線程程序:有多個線程,線程間獨立運行,能有效地避免代碼阻塞,並且提高程序的運行性能
5.為什麼要使用多線程?
(1)使用多線程可以減少程序的響應時間。 在單線程的情況下,如果某個程序很耗時或者陷入長時間等待(如等待網路響應),此時程序將不會相應滑鼠和鍵盤等操作,使用多線程後,可以把這個耗時的線程分配到一個單獨的線程去執行,從而是程序具備了更好的交互性。
(2)與進程相比,線程的創建和切換開銷更小。 由於啟動一個新的線程必須給這個線程分配獨立的地址空間,建立許多數據結構來維護線程代碼段、數據段等信息,而運行於同一個進程內的線程共享代碼段、數據段,線程的啟動或切換的開銷就比進程要少很多。同時多線程在數據共享方面效率非常高。
(3)多CPU或多核心計算機本身就具有執行多線程的能力。 如果使用單個線程,將無法重複利用計算機資源,造成資源的巨大浪費。因此在多CPU計算機上使用多線程能提高CPU的利用率。
(4)使用多線程能簡化程序的結構,使用程序便於理解和維護。 一個非常複雜的進程可以分成多個線程來執行。
6.什麼是線程安全?
當多個線程訪問同一個對象時,如果不用考慮這些線程在運行時環境下的調度和交替運行,也不需要進行額外的同步,或者在調用方進行任何其他的協調操作,調用這個對象的行為都可以獲取正確的結果,那這個對象是線程安全的。 ——<<深入Java虛擬機>>
7.為何要使用線程同步?
Java允許多線程並發控制,當多個線程同時操作一個可共享的資源變數時(如數據的增刪改查),將會導致數據不準確,相互之間產生衝突。
因此加入同步鎖以避免在該線程沒有完成操作之前,被其他線程的調用,從而保證了該變數的唯一性和準確性。
8.如何確保線程安全?
- 對非安全的代碼進行加鎖控制
- 使用線程安全的類
- 多線程並發情況下,線程共享的變數改為方法級的局部變數
9.什麼是原子操作?
檢查數值、改變數值,以及可能發生的睡眠操作均作為單一的、不可分割的原子操作完成。
10Java內存模型是什麼?
- Java中所有變數都儲存在主存中,對於所有線程都是共享的(因為在同一進程中),每個線程都有自己的工作內存或本地內存(Working Memory),工作內存中保存的是主存中某些變數的拷貝,線程對所有變數的操作都是在工作內存中進行,而線程之間無法相互直接訪問,變數傳遞均需要通過主存完成,但是在程序內部可以互相調用(通過對象方法),所有線程間的通信相對簡單,速度也很快。