【多線程】算法
35. 並行和併發有什麼區別?數據庫
舉個例子:排隊打飯,當只有一個窗口能夠打飯的時候,咱們排成了兩排,那麼這兩排只能一邊一個來,這就是併發;
若是有兩個窗口能夠打飯的話,一個隊一個窗口,那麼這兩排能夠同時進行打飯,這就是並行了。緩存
36. 線程和進程的區別?安全
首先一個程序下至少有一個進程,一個進程下至少有一個線程,一個進程下也能夠有多個線程來增長程序的執行速度。session
線程是運行調度的最小單位;進程是資源調度的最小單位。多線程
進程在執行過程當中擁有獨立的內存單元,而多個線程共享內存。併發
37. 守護線程是什麼?jvm
守護線程是運行在後臺的一種特殊進程。它獨立於控制終端而且週期性地執行某種任務或等待處理某些發生的事件。在 Java 中垃圾回收線程就是特殊的守護線程。性能
38. 建立線程有哪幾種方式?優化
建立線程有三種方式:
39. 說一下 runnable 和 callable 有什麼區別?
runnable 沒有返回值,callable 能夠拿到有返回值,callable 能夠看做是 runnable 的補充。
40. 線程有哪些狀態?
線程從建立、運行到結束老是處於下面五個狀態之一:新建狀態、就緒狀態、運行狀態、阻塞狀態及死亡狀態。
41. sleep() 和 wait() 有什麼區別?
42. notify()和 notifyAll()有什麼區別?
notifyAll()會喚醒全部的線程,notify()以後喚醒一個線程。notifyAll() 調用後,會將所有線程由等待池移到鎖池,而後參與鎖的競爭,競爭成功則繼續執行,若是不成功則留在鎖池等待鎖被釋放後再次參與競爭。而 notify()只會喚醒一個線程,具體喚醒哪個線程由虛擬機控制。
43. 線程的 run() 和 start() 有什麼區別?
start() 方法用於啓動線程,run() 方法用於執行線程的運行時代碼。run() 能夠重複調用,而 start() 只能調用一次。
44. 建立線程池有哪幾種方式?
線程池建立有七種方式,最核心的是最後一種:
45. 線程池都有哪些狀態?
46. 線程池中 submit() 和 execute() 方法有什麼區別?
Callable 類型的任務能夠獲取執行的返回值,而 Runnable 執行無返回值。
47. 在 Java 程序中怎麼保證多線程的運行安全?
手動鎖 Java 示例代碼以下:
Lock lock = new ReentrantLock(); lock. lock(); try { System. out. println("得到鎖"); } catch (Exception e) { // TODO: handle exception } finally { System. out. println("釋放鎖"); lock. unlock(); }
48. 多線程中 synchronized 鎖升級的原理是什麼?
synchronized 鎖升級原理:在鎖對象的對象頭裏面有一個 threadid 字段,在第一次訪問的時候 threadid 爲空,jvm 讓其持有偏向鎖,並將 threadid 設置爲其線程 id,再次進入的時候會先判斷 threadid 是否與其線程 id 一致,若是一致則能夠直接使用此對象,若是不一致,則升級偏向鎖爲輕量級鎖,經過自旋循環必定次數來獲取鎖,執行必定次數以後,若是尚未正常獲取到要使用的對象,此時就會把鎖從輕量級升級爲重量級鎖,此過程就構成了 synchronized 鎖的升級。
鎖的升級的目的:鎖升級是爲了減低了鎖帶來的性能消耗。在 Java 6 以後優化 synchronized 的實現方式,使用了偏向鎖升級爲輕量級鎖再升級到重量級鎖的方式,從而減低了鎖帶來的性能消耗。
49. 什麼是死鎖?
當線程 A 持有獨佔鎖a,並嘗試去獲取獨佔鎖 b 的同時,線程 B 持有獨佔鎖 b,並嘗試獲取獨佔鎖 a 的狀況下,就會發生 AB 兩個線程因爲互相持有對方須要的鎖,而發生的阻塞現象,咱們稱爲死鎖。
50. 怎麼防止死鎖?
51. ThreadLocal 是什麼?有哪些使用場景?
ThreadLocal 爲每一個使用該變量的線程提供獨立的變量副本,因此每個線程均可以獨立地改變本身的副本,而不會影響其它線程所對應的副本。
ThreadLocal 的經典使用場景是數據庫鏈接和 session 管理等。
52. 說一下 synchronized 底層實現原理?
synchronized 是由一對 monitorenter/monitorexit 指令實現的,monitor 對象是同步的基本實現單元。在 Java 6 以前,monitor 的實現徹底是依靠操做系統內部的互斥鎖,由於須要進行用戶態到內核態的切換,因此同步操做是一個無差異的重量級操做,性能也很低。但在 Java 6 的時候,Java 虛擬機 對此進行了大刀闊斧地改進,提供了三種不一樣的 monitor 實現,也就是常說的三種不一樣的鎖:偏向鎖(Biased Locking)、輕量級鎖和重量級鎖,大大改進了其性能。
53. synchronized 和 volatile 的區別是什麼?
54. synchronized 和 Lock 有什麼區別?
55. synchronized 和 ReentrantLock 區別是什麼?
synchronized 早期的實現比較低效,對比 ReentrantLock,大多數場景性能都相差較大,可是在 Java 6 中對 synchronized 進行了很是多的改進。
主要區別以下:
56. 說一下 atomic 的原理
atomic 主要利用 CAS (Compare And Wwap) 和 volatile 和 native 方法來保證原子操做,從而避免 synchronized 的高開銷,執行效率大爲提高。