併發程式設計 執行緒篇

2022-01-10 00:16:18 字數 1517 閱讀 4890

public class shutdown 

private static class runner implements runnable

system.out.println("count i = " + i);

}public void cancel() }}

本質:對乙個物件的監視器(monitor)進行獲取,而這個獲取過程是排他的,也就是同一時刻只能有乙個執行緒獲取到由synchronized所保護物件的監視器。

等待/通知機制,是指乙個執行緒a呼叫了物件o的wait()方法進入等待狀態,而另乙個執行緒b呼叫了物件o的notify()或者notifyall()方法,執行緒a收到通知後從物件o的wait()方法返回,進而執行後續操作。

方法使用注意事項

上圖中,waitthread首先獲取了物件的鎖,然後呼叫物件的wait()方法,從而放棄了鎖並進入了物件的等待佇列waitqueue中,進入等待狀態。由於waitthread釋放了物件的鎖,notifythread隨後獲取了物件的鎖,並呼叫物件的notify()方法,將waitthread從waitqueue移到synchronizedqueue中,此時waitthread的狀態變為阻塞狀態。notifythread釋放了鎖之後,waitthread再次獲取到鎖並從wait()方法返回繼續執行。

定義:如果乙個執行緒a執行了thread.join()語句,當前執行緒a等待thread執行緒終止之後才從thread.join()返回。

採用threadlocal根本就沒有競爭。

記憶體洩露:

實際上threadlocalmap中使用的key為threadlocal的弱引用,弱引用的特點是,如果這個物件只存在弱引用,那麼在下一次垃圾**的時候必然會被清理掉。所以如果threadlocal沒有被外部強引用的情況下,在垃圾**的時候會被清理掉的,這樣一來threadlocalmap中使用這個threadlocal的key也會被清理掉。但是,value是強引用,不會被清理,這樣一來就會出現key為null的value。threadlocalmap實現中已經考慮了這種情況,在呼叫set()、get()、remove()方法的時候,會清理掉key為null的記錄。如果說會出現記憶體洩漏,那只有在出現了key為null的記錄後,沒有手動呼叫remove()方法,並且之後也不再呼叫get()、set()、remove()方法的情況下。

併發程式設計雜篇

atomically adds the given value to the current value.param delta the value to add return the updated value public final intaddandget int delta public ...

併發程式設計 基礎篇

當前物件型別 物件頭長度 陣列3字長 非陣列2字長 長度內容 說明1個字長 32bit 64bit mark world 儲存物件的hashcode以及鎖的資訊 1個字長 class metedata address 儲存物件型別資料的指標 1個字長 array length 陣列長度 如果物件是陣...

併發程式設計之多執行緒篇之一

本節主要知識點包括三個方面 一 執行緒的含義 二 程序和執行緒的區別 三 開啟程序的兩種方式 1 什麼是執行緒和多執行緒?1 在傳統作業系統中,每個程序有乙個位址空間,而且預設就有乙個控制線程。執行緒顧名思義,就是一條流水線工作的過程 流水線的工作需要電源,電源就相當於cpu 而一條流水線必須屬於乙...