一、
thread.sleep() 當前執行緒睡眠指定時間後回到就緒狀態(回到等待佇列)
thread.yield() 當前執行緒直接回到就緒狀態(回到等到佇列)
thread.join() 讓其他執行緒在此行執行後優先執行,等他執行完了,當前才開始執行
this.getstate() 當前執行緒的狀態(六大狀態,runnable自己算一種,下圖裡面最大的塊是runnable狀態)禁止stop()方法
interrupt()在wait,sleep等方法時打斷並丟擲乙個異常,catch這個異常進行處理(比如說睡了2天,你需要打斷他)
注(重點):wait()方法會釋放當前的同步鎖,其他執行緒可以搶了,notify()喚醒執行緒之後需要重新搶鎖才能執行鎖內部分!!
二、執行緒三種實現方式
三、synchronized
可見性(多執行緒之間修改互相可見)
原子性(當前**塊內有執行緒在執行,其他執行緒不可進入,鎖定的是物件(this / xx.class,普通方法鎖this,static方法鎖xx.class)而不是**,在new object()時,是64位的,頭裡面有2位markword代表各種的鎖,執行緒來了是得到這個物件而不是鎖**)
synchronized(this)
synchronized void function()
相同;可重入(synchronized方法中呼叫另乙個synchronized方法是可以的,因為是同乙個執行緒呼叫m2時發現是自己拿到了這把鎖,ok可以進入)
鎖定的方法和非鎖定方法可以同時執行(new thread)。
synchronized(object),這裡的object不能用string常量(因為常量都是大家指向同乙個區域的,鎖定了這個可能別的地方受影響) integer(因為integer物件封裝時內部進行了處理,值發生改變就會產生乙個新的物件) long等等基礎的資料型別…
注:
程式之中遇見了異常,預設情況下會釋放鎖,catch了異常不丟擲然後讓程式繼續執行下去即可避免。
下圖中加了synchronized之後就沒必要在count前加volatile了,因為synchronized既保證了原子性,***了可見性
四、synchronized的底層實現
鎖公升級sync(object)
偏向鎖:當new object時,markword記錄這個執行緒id(使用偏向鎖),如果還是這個執行緒執行,那麼直接放行。
自旋鎖:如果偏向鎖有執行緒爭用,公升級為自旋鎖,自旋鎖是消耗cpu資源的。
重量級鎖(os級別,核心態):自旋鎖預設是自旋10次後,如果還得不到這把鎖,公升級為重量級鎖,重量級鎖在乙個執行緒得到後,其他的執行緒回到等待佇列,是不占用cpu資源的。
結論:執行時間段(枷鎖**),執行緒數少,用自旋鎖。
執行時間長,執行緒數多,用重量級鎖。
鎖一般來講是不能降級的。
北京馬士兵教育學習筆記整理
多執行緒與高併發 一
建立乙個執行緒的兩種方式 繼承threadclass mythread extends thread newmythread start 實現runnable介面class mythread implements runnable newthread new myrun start 面試時候有時候會...
多執行緒與高併發(一)
官方概念 幾乎所有的作業系統都支援同時執行多個任務,乙個任務通常是乙個程式,每個執行中的程式就是乙個程序。當乙個程式執行時,內部可能包含了多個順序執行流,每個順序執行流就是乙個執行緒。而執行緒呢,乙個程序裡最小的執行單元就叫乙個執行緒。簡單理解就是乙個程式不同的執行路徑。示例 public clas...
多執行緒與高併發
blocked 鎖池 timed waiting 定時等待 waiting 等待 terminated 禁止指令重排序 記憶體屏障 在單例雙重檢查中,不加會出現使用半初始化的值,也就是還未附初始值,指令重排導致的 類載入與指令重排的知識 public class spinlock while fla...