一: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...