1. 程式人生 > >java面試/筆試題目之多執行緒及鎖 (持續更新中)

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及其特性

   參照下面這三個:

十二.什麼是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