多執行緒中可以使用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...