java面試/筆試題目之多執行緒及鎖 (持續更新中)
前言:這一模組可以參照徐劉根大佬的部落格。
一.執行緒和程序的概念、並行和併發的概念
1.程序:是計算機中的程式關於某資料集合上的一次執行活動,是系統 進行資源分配和排程的基本單位,是作業系統結構的基礎。程式是指令、資料及其組織形式的描述,程序是程式的實體。
2.執行緒:是程式執行流的 最小單元。執行緒是程式中一個單一的順序控制流程。程序內一個相對獨立的、可排程 的執行單元,是系統獨立排程和分派CPU的基本單位指執行中的程式的排程單位。在 單個程式中同時執行多個執行緒完成不同的工作,稱為多執行緒。
3.兩者區別:
- 1、程序是資源分配的最小單位,執行緒是程式執行的最小單位。
- 2、程序有自己的獨立地址空間,每啟動一個程序,系統就會為它分配地址空 間,建立資料表來維護程式碼段、堆疊段和資料段,這種操作非常昂貴。而執行緒是 共享程序中的資料的,使用相同的地址空間,因此CPU切換一個執行緒的花費遠比 程序要小很多,同時建立一個執行緒的開銷也比程序要小很多,執行緒的上下文切換 的效能消耗要小於程序。
- 3、執行緒之間的通訊更方便,同一程序下的執行緒共享全域性變數、靜態變數等數 據,而程序之間的通訊需要以通訊的方式(IPC)進行。不過如何處理好同步與互 斥是編寫多執行緒程式的難點。
- 4、但是多程序程式更健壯,多執行緒程式只要有一個執行緒死掉,整個程序也死掉 了,而一個程序死掉並不會對另外一個程序造成影響,因為程序有自己獨立的地 址空間。
二.建立執行緒的方式及實現
建立執行緒的方法有三種:
(1)繼承Thread類,重寫run方法;
public class MyThread extends Thread { @Override public void run() { while (true) { System.out.println(this.currentThread().getName()); } } public static void main(String[] args) { MyThread thread = new MyThread(); thread.start(); //執行緒啟動的正確方式 } }
啟動執行緒的是start()方法而不是run()方法,run()方法只是一個普通的方法執行了,也就是隻是會執行一次,
(2)實現Runnable介面,並將物件例項例作為引數傳遞給Thread類的構造方法;
public class MyRunnable implements Runnable {
@Override
public void run() {
System.out.println("123");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable();
Thread thread = new Thread(myRunnable, "t1");
thread.start();
}
}
Thread類本身實現了Runnable介面,並且持有run方法,但Thread類的run方法主體是空的,Thread類的run方法通常是由
子類的run方法重寫。
(3)實現callable介面,並實現call方法,並且執行緒執行完畢後會有返回值。
三.執行緒間通訊的方式
參看:https://blog.csdn.net/striveb/article/details/83542145
四.說說 CountDownLatch、CyclicBarrier 原理和區別
五.說說 Semaphore 原理
六.說說 Exchanger 原理
七.ThreadLocal 原理分析,ThreadLocal為什麼會出現OOM,出現的深層次原理
關於ThreadLocal 可以看這個:https://blog.csdn.net/striveb/article/details/83412848
八.講講執行緒池的實現原理
九.執行緒池的幾種實現方式
十.執行緒的生命週期,狀態是如何轉移的
十一.什麼是synchronized及其特性
參照下面這三個:
- https://blog.csdn.net/striveb/article/details/83415182
- http://www.cnblogs.com/pureEve/p/6421273.html
- https://blog.csdn.net/xlgen157387/article/details/78005352
十二.什麼是lock物件和ReentrantLock?
https://blog.csdn.net/striveb/article/details/83421107
十三.什麼是volatile,有什麼作用?
https://blog.csdn.net/striveb/article/details/83537133
徐劉根大佬的多執行緒專欄:https://blog.csdn.net/column/details/17790.html