多執行緒核心技術 Lock的使用

2021-08-17 04:26:23 字數 4281 閱讀 7161

一:reentrantlock類

reentrantlock類可以實現執行緒間同步互斥,嗅探鎖定,多路分支通知等功能。

呼叫reentrantlock物件的lock()方法獲取鎖,呼叫unlock()方法釋放鎖。

使用condition實現等待/通知:

使用condition具有良好的靈活性,實現多路通知功能,也就是在乙個lock物件裡面建立多個condition(即物件監視器)例項,執行緒物件可以註冊在指定的condition中,從而有選擇的進行執行緒通知,在排程執行緒上更加靈活。

而synchronized就相當於整個lock物件中只有乙個單一的condition物件,所有的執行緒都註冊在它乙個物件的身上。執行緒開始notifyall()時,需要通知所有的waiting執行緒,沒有選擇權,會出現效率問題。

private reentrantlock lock = new  reentrantlock( );

private condition condition = lock.newcondition( );

先呼叫lock.lock()**獲得同步監視器,然後再呼叫condition.await( ).使當前執行任務的執行緒進入等待waiting狀態。

try-catch-finally語句中 condition.await( )方法放在**出口(及try**塊的最後一行),在finally**塊中lock.unlock( )。

service.signalall( )喚醒所有執行緒。---》可指定物件

公平鎖和非公平鎖

公平鎖表示執行緒獲取鎖的順序是按照執行緒加鎖的順序來分配的,即先來先得的fifo先進先出順序。結果有序。

非公平鎖就是一種獲取鎖的搶占機制,是隨機獲得鎖的,和公平鎖不一樣的是先來的不一定先得到鎖,這種方式可能造成某些執行緒一直得不到鎖,結果是不公平的。結果無序。

方法getholdcount(),getqueuelength()和getwaitqueuelength()

1)方法getholdcount()的作用是查詢當前執行緒保持此鎖定的個數,

也就是呼叫lock()方法的次數。2)

方法getqueuelength()的作用是返回正等待獲取此鎖的執行緒估計數。等待lock釋放的執行緒個數。

3)方法getwaitqueuelength()的作用是返回等待此鎖定相關的給定條件condition的執行緒估計數。

方法hasqueuedthread(),has

queuedthread()和haswaiters()

1)boolean has

queuedthread()的作用是查詢是否有執行緒正在等待獲取此鎖定。

2)boolean 

haswaiters

()的作用是查詢是否有執行緒正在等待獲取此鎖定有關的condition條件。

方法isfair

(),isheldbycurrentthread

()和islocked

()1)boolean isfair()判斷是否為公平鎖。在預設情況下,reentrantlock類使用的是非公平鎖。

2)boolean isheldbycurrentthread()的作用是查詢當前執行緒是否保持此鎖定。

3)boolean islocked()的作用是查詢此鎖定是否由任意執行緒保持。

方法lockinterruptibly

(),trylock

()和trylock

(long  timeout ,timeunit  unit)

1)方法void  lockinterruptibly()的作用是:如果當前執行緒未被中斷,則獲取鎖定,如果已經中斷則出現異常。

lock.interrupt(  )執行緒中斷後,lock()不出現異常,正常執行。

lock.lockinterruptibly(  )執行緒中斷後,lock()報異常,停止執行。

2)方法boolean  trylock()的作用是:僅在呼叫時鎖定未被另乙個執行緒保持的情況下,才獲取該鎖定。

3)方法boolean  trylock

(long  timeout ,timeunit  unit)的作用是:如果在鎖定給定等待時間內沒有被另乙個執行緒保持,且當前執行緒未被中斷,則獲取該鎖定。

方法awaituninterruptibly

()的使用

await出現異常,awaituninterruptibly正常執行無異常。

方法awaituntil

()的使用

指定時間喚醒,但在是等待時間內,可被其他執行緒提前喚醒。

使用condition實現順序執行

使用condition物件可以對執行緒執行的業務進行排序規劃。

二:reentrantreadwritelock類

使用寫鎖**lock.writelock( )的效果就是同一時間只允許乙個執行緒執行lock()方法後面的**。

定時器timer的使用

timer的主要作用就是設定計畫任務,但封裝的類是timertask類,執行計畫任務的**放入timertask的子類中,timer是乙個抽象類。

方法schedule(timertask    task,date    time)該方法的作用是在指定的日期執行一次某一任務。

建立乙個timer就是啟動乙個新的執行緒,這個新啟動的執行緒並不是守護執行緒,它不會執行完就關閉,需要將建立timer的執行緒改為守護執行緒。new timer(true);

3)多個timertask任務執行:順序執行

方法schedule(timertask    task,date    firsttime    long    period)該方法的作用是在指定的日期之後,按指定的間隔周期性地無限迴圈地執行某一任務。

3)任務執行時間被延時:任務延時但還是乙個乙個執行(即不能保證執行時間與預期時間一致)

timertask類的cancel()方法

timertask類中的cancel()方法的作用是將自身從任務佇列中清除,其他任務不收影響。

timer類的cancel()方法

和timertask類中的cancel()方法清除自身不同,timer類中的cancel()方法的作用是將任務佇列中的全部任務清空,並且程序任務被銷毀。

注意:timer類中的cancel()方法的有時並不一定會停止執行任務計畫,而會正常執行。這是因為timer類中的cancel()方法有時並沒有爭搶到queue鎖,所以其他任務還會繼續正常執行。

方法schedule(timertask    task,long    period)以執行當前方法的時間為參考時間,在此時間基礎上延遲指定的毫秒數後執行一次timertask任務。

方法schedule(timertask    task,

long    delay

,long    period)

以執行當前方法的時間為參考時間,在此時間基礎上延遲指定的毫秒數,再以某一間隔時間無限次數地執行一次某一任務。

方法scheduleatfixedrate(timertask    task,date    firsttime

相同點:

1、方法schedule 和方法 scheduleatfixedrate 都會按順序執行,所以不用考慮非執行緒安全的情況。

2、方法schedule 和方法 scheduleatfixedrate 如果執行任務的時間沒有被延遲,那麼下一次任務的執行時間參考的是上一次的任務的"開始"時的時間來計算的。

3、方法schedule 和方法 scheduleatfixedrate 如果執行任務的時間被延遲了,那麼下一次任務的執行時間參考的是上一次任務"結束"時的時間來計算。

1)執行schedule方法任務不延時:則下一次執行任務的時間是上一次任務的開始時間加上delay時間。

2)執行schedule方法任務延時:則下一次執行任務的時間是上一次任務「結束」時的開始時間為參考來計算。

3)schedule方法不具有追趕執行性

1)執行scheduleatfixedrate方法任務不延時:則下一次執行任務的時間是上一次任務的開始時間加上delay時間。

2)執行scheduleatfixedrate方法任務延時:則下一次執行任務的時間以上一次任務「結束」時的時間為參考來計算。

3)scheduleatfixedrate方法具有追趕執行性

就是如果任務 在週期性執行過程中被打斷了,scheduleatfixedrate 會嘗試把之前落下的任務補上執行。

多執行緒核心技術 Lock

多執行緒中可以使用synchronized來進行執行緒同步互斥,在jdk1.5之後引入了reentrantlock類,不僅可以實現synchronized的功能,還進行了拓展,下面簡單寫個demo myservice public class myservice finally mythread p...

Java多執行緒 程式設計核心技術4Lock

執行緒間同步互斥,且嗅探鎖定 多路分支通知,使用上較synchronized靈活 呼叫該物件的lock 獲取鎖,unlock 釋放鎖 借助condition實現等待 通知模式 condition 物件監視器 是jdk5 靈活性 多路通知 乙個lock物件中建多個condition例項,執行緒物件可以...

Java多執行緒 程式設計核心技術5 Lock

1 計畫時間早於當前時間,提前執行 2 timertask類的cancel 方法 將自身從任務佇列中清除 3 timer類的cancel方法 清空任務佇列的全部任務 如果該方法沒有搶到鎖,任務還是繼續執行 4 schedule timertask task long delay,long perio...