1. 程式人生 > >Java多執行緒有哪幾種實現方式? Java中的類如何保證執行緒安全? 請說明ThreadLocal的用法和適用場景(面試題)

Java多執行緒有哪幾種實現方式? Java中的類如何保證執行緒安全? 請說明ThreadLocal的用法和適用場景(面試題)

Java多執行緒有哪幾種實現方式? Java中的類如何保證執行緒安全? 請說明ThreadLocal的用法和適用場景

Java多執行緒有三種實現方式:
(1)繼承Thread類,重寫run函式
(2)實現Runnable介面,重寫run函式
開啟執行緒:Thread t = new Thread(物件) //建立執行緒物件
t.start()
(3)實現Callable介面,重寫call函式
Callable是類似於Runnable的介面,實現Callable介面的類和實現Runnable的類都是可被其它執行緒執行的任務。
Callable和Runnable有幾點不同:
①Callable規定的方法是call(),而Runnable規定的方法是run().
②Callable的任務執行後可返回值,而Runnable的任務是不能返回值的
③call()方法可丟擲異常,而run()方法是不能丟擲異常的。
④執行Callable任務可拿到一個Future物件,Future表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並檢索計算的結果.通過Future物件可瞭解任務執行情況,可取消任務的執行,還可獲取任務執行的結果

java的同步機制,一般有:
1.synchronized;
2.Object方法中的wait,notify;
3.ThreadLocal機制   來實現的。
其中synchronized有兩種用法:1.對類的方法進行修飾 2.synchronized(物件)的方法進行修飾

在同步機制中,通過物件的鎖機制保證同一時間只有一個執行緒訪問變數。

這時該變數是多個執行緒共享的,使用同步機制要求程式慎密地分析什麼時候對變數進行讀寫,什麼時候需要鎖定某個物件,什麼時候釋放物件鎖等繁雜的問題,程式設計和編寫難度相對較大。
ThreadLocal不是用來解決物件共享訪問問題的,而主要是提供了保持物件的方法和避免參數傳遞的方便的物件訪問方式。
歸納為兩點:
1。每個執行緒中都有一個自己的ThreadLocalMap類物件,可以將執行緒自己的物件保持到其中,各管各的,執行緒可以正確的訪問到自己的物件。
2。將一個共用的ThreadLocal靜態例項作為key,將不同物件的引用儲存到不同執行緒的ThreadLocalMap中,然後線上程執行的各處通過這個靜態ThreadLocal例項的get()方法取得自己執行緒儲存的那個物件,避免了將這個物件作為引數傳遞的麻煩。

  當然ThreadLocal並不能替代同步機制,兩者面向的問題領域不同。同步機制是為了同步多個執行緒對相同資源的併發訪問,是為了多個執行緒之間進行通訊的有效方式;而ThreadLocal是隔離多個執行緒的資料共享,從根本上就不在多個執行緒之間共享資源(變數),這樣當然不需要對多個執行緒進行同步了。所以,如果你需要進行多個執行緒之間進行通訊,則使用同步機制;如果需要隔離多個執行緒之間的共享衝突,可以使用ThreadLocal,這將極大地簡化你的程 序,使程式更加易讀、簡潔。