java多執行緒

2021-07-29 21:34:59 字數 1956 閱讀 8132

每個執行緒執行時都有乙個執行緒棧,它儲存了執行緒執行時的變數,當乙個執行緒訪問乙個物件時,首先通過物件的引用找到其對應在堆記憶體的變數值,然後把變數的具體值load到該執行緒的執行緒棧中,之後執行緒就和物件在堆記憶體的變數值沒有關係了,而是直接修改副本變數的值,修改完成後某一時刻(執行緒退出前),自動把執行緒變數副本的值回寫到物件在堆中的變數。

volatile修飾的變數,jvm虛擬機器只是保證從主記憶體載入到執行緒工作記憶體的值是最新的,並不能規避併發問題。同乙個物件的同步**塊(乙個或多個),同一時間內只能有乙個執行緒訪問,其他執行緒的訪問(無論是該同步**塊還是該物件其他同步**塊)都處於阻塞狀態直到先前執行緒訪問結束,此時,其他執行緒仍可以訪問該物件的非同步**塊,synchronized同時修飾乙個類的靜態方法和非靜態方法,執行緒訪問,乙個獲取的是類鎖、乙個是獲取的物件鎖,互不干擾,可以同時訪問,同樣乙個執行緒可以同時獲得這兩個鎖。

執行緒協作-生產者/消費者問題。這三個方法都是object的方法,呼叫wait將釋放鎖,notify隨機喚醒乙個執行緒,notifyall喚醒所有執行緒。

在呼叫wait方法時,都是用while判斷條件的,而不是if,在wait方法說明中,也推薦使用while,因為在某些特定的情況下,執行緒有可能被假喚醒,使用while會迴圈檢測更穩妥。wait和notify方法必須工作於synchronized內部,且這兩個方法只能由鎖物件來呼叫。

執行緒讓步

-static void yield()暫停當前正在執行的執行緒,並執行其他執行緒,如果存在synchronized執行緒同步的話,執行緒讓步不會釋放鎖(監視器物件)。

執行緒睡眠

-static void sleep(long millis)讓當前執行緒暫停執行millis毫秒,如果存在synchronized執行緒同步的話,執行緒讓步不會釋放鎖(監視器物件)。

-static void sleep(long millis, int nanos)讓當前執行緒暫停執行millis毫秒 + nanos納秒,如果存在synchronized執行緒同步的話,執行緒讓步不會釋放鎖(監視器物件)。

執行緒合併

-void join()等待該執行緒終止;

-void join(long millis)等待該執行緒終止的時間最長為 millis毫秒;

-void join(long millis, int nanos)等待該執行緒終止的時間最長為 millis毫秒 + nanos納秒。

所謂合併就是等待其他執行緒執行完成,再執行當前執行緒

執行緒優先順序

timer和timertask,自jdk5之後,可以用scheduledthreadpoolexecutor來替代timer。

建立執行緒的2種方式,一種是直接繼承thread,另外一種就是實現runnable介面,這兩種方式的缺點是:在執行完任務後無法獲取執行結果,從jdk5開始,就提供了callable和future,通過它們可以在任務執行完畢之後得到任務執行結果。閱讀過android中asynctask原始碼的同學應該會發現asynctask中也應用了這兩個類。

用sychronized修飾的方法或者語句塊在**執行完之後鎖自動釋放,而用lock需要我們手動釋放鎖,所以為了保證鎖最終被釋放(發生異常情況),要把互斥區放在try內,釋放鎖放在finally內。與synchronized的區別

condition中await()對應object#wait(),signal()對應object#notify(),signalall()對應object#notifyall(),condition與lock結合使用,通過lock.newcondition()方法建立與lock繫結的condition例項。lock和condition的關係就如同 object.wait(),object.notify()方法和synchronized一樣,它們都可以配合使用完成對多執行緒協作的控制。

其他不常用的暫不記載,例如cas、平行計算的框架fork/join、threadlocal、blockingqueue等

java多執行緒

在網上看到很有意思的問題,摘下來好好看下 在面試的時候被問了乙個多執行緒的問題 回來仔細思考了一下,多執行緒是否真的能提高了效率?我對多執行緒的理解就是 比如挖乙個隧道,有2種開工方法 1 只在山的一頭挖,直至挖到山的另一頭,從而打通隧道,這可以看成是單執行緒 2 在山的兩頭挖,同時開工,最後在山的...

Java 多執行緒

1。thread類和runnable介面 2。主線程 用thread的static thread currentthread 方法獲得 3。通過實現runnable介面建立執行緒 實現runnable介面的run方法。新執行緒在run 方法返回時結束。注意用這種方法建立程序時,在實現runnable...

JAVA 多執行緒

為hashmap的不正確使用所導致。hashmap在多執行緒環境下使用不安全。使用靜態hashmap作為聯絡人資料快取,key為手機號碼.private static maplxrdata new hashmap 多執行緒環境下不同步hashmap可能導致如下問題 1 多執行緒put操作後可能導致g...