多執行緒核心技術 Lock

2021-08-16 08:24:04 字數 2651 閱讀 3064

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

myservice

public class myservice 

}finally

}}

mythread

public class mythread extends thread

@override

public void run()

}

run

public class run 

}

列印結果是同步執行的

synchronized可以通過物件的wait()和notify()以及notifyall()組合實現等待/通知模式,reentrantlock同樣可以實現,需要借助condition物件,並且notify的物件是隨機的,由jvm選擇,但是condition可以指定「喚醒」某執行緒

public class myservice  catch (interruptedexception e)  finally 

}public void signal()finally

}}

threada

public class threada extends thread 

@override

public void run()

}

run類

public class run 

}

執行結果列印為:

使用condition需要注意,要在監視器物件中使用,如果不適用lock則會報無監視器物件的異常,lock最好放在finally**塊中確保釋放,與wait對比

object

condition

wait(long timeout)

await(long time,timeunit unit)

wait()

await()

notifyall()

signalall()

notify()

signal()

不同的condition物件可以指定喚醒

reentrantlock的相關api

方法入參型別

返回值型別

作用getholdcount()

/int

查詢當前執行緒保持此鎖的個數,也是呼叫lock方法的次數

getqueuelength()

/int

返回整等待獲取此鎖定的執行緒估計數

getwaitqueuelength()

condition

int查詢等待次鎖定相關的給定條件condition的執行緒估計數

hasqueuedthread()

thread

boolean

查詢指定執行緒是否正在等待獲取此鎖

hasqueuedthreads()

/boolean

查詢是否有執行緒正在等待獲取此鎖

haswaiters()

condition

boolean

是否有執行緒正在等待與此鎖定有關的condition條件

isfair()

/boolean

判斷是否是公平鎖

isheldbycurrentthread()

/boolean

查詢當前執行緒是否保持此鎖

islocked()

/boolean

查詢此鎖定是否有人以執行緒保持

lockinterruptibly()//

如果當前執行緒未被中斷則獲取鎖,已經被中斷則拋異常

trylock()

/boolean

僅在呼叫時鎖定未被另乙個執行緒保持的情況下,才獲取該鎖定

trylock()

long,timeunit

boolean

如果鎖定在給定時間內沒有被另乙個執行緒保持,且當前執行緒未被中斷,則獲取該鎖定

讀寫鎖幾個特性:讀讀共享,寫寫互斥,讀寫互斥,寫讀互斥,可參考下面**

myservice

public class myservice finally 

}catch(interruptedexception e)

}public void write()finally

}catch (interruptedexception e)

}}

threada和threadb

public class threada extends thread 

@override

public void run() }

public class threadb extends thread

@override

public void run()

}

run

public class run 

}

可以通過修改run類的方法,進行驗證四個特性

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

一 reentrantlock類 reentrantlock類可以實現執行緒間同步互斥,嗅探鎖定,多路分支通知等功能。呼叫reentrantlock物件的lock 方法獲取鎖,呼叫unlock 方法釋放鎖。使用condition實現等待 通知 使用condition具有良好的靈活性,實現多路通知功能...

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