Java并发编程的艺术(十)——Java中的锁(5)
生活随笔
收集整理的這篇文章主要介紹了
Java并发编程的艺术(十)——Java中的锁(5)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1. LockSupport工具
1.1 LockSupport的作用
當需要阻塞或喚醒一個線程的時候,都會使用LockSupport工具類來完成相應工作。LockSupport定義了一組公共的靜態方法,這些方法提供了做基本的線程阻塞和喚醒功能。
1.2 LockSupport提供的阻塞和喚醒方法
| void park() | 阻塞當前線程,如果調用unpark(Thread)方法或被中斷,才能從park()返回。 |
| void parkNanos(long nanos) | 阻塞當前線程的超時返回版本,阻塞時間最長不超過nanos納秒。 |
| void parkUntil(long deadline) | 阻塞當前線程,直到deadline時間(從1970年開始到deadline時間的毫秒數)。 |
| void unpark(Thread) | 喚醒處于阻塞狀態的線程. |
1.3 LockSupport新增的方法
在Java 6中,LockSupport增加了park(Object blocker)、parkNanos(Object blocker, long nanos)、parkUntil(Object blocker, long deadline)這3個方法,用于實現阻塞當前線程的功能,其中參數blocker是用來標識當前線程在等待的對象,該對象主要用于問題排查和系統監控。
2. Condition接口
2.1 Condition接口的理解
Java對象的wait()、notify()等方法和synchronized關鍵字配合,可以實現等待/通知模式。此外還有一種方式可以實現等待/通知模式:Condition接口與Lock接口配合。
2.2 Condition接口示例
public class ConditionUseCase {Lock lock = new ReentrantLock();Condition condition = lock.newCondition();public void conditionWait() throws InterruptedException {lock.lock();try {condition.await();} finally {lock.unlock();}}public void conditionSingnal() throws InterruptedException {lock.lock();try {condition.signal();} finally {lock.unlock();}} } 復制代碼- 1.Condition定義了等待/通知模式的相關方法,并且Condition實例是由鎖創建出來的,在調用Condition的這些方法前需先獲得和Condition對象相關聯的鎖。
- 2.調用await()方法后,當前線程釋放鎖并進入等待狀態,當其他對象調用Condition的signal()方法后當前線程才能從await()方法中返回,且返回前已經獲得了鎖。
2.3 Condition的方法
| void await() throws InterruptedException | 當前線程進入等待狀態,直到被通知(signal)或者被中斷。 |
| void awaitUninterruptibly() | 當前線程進入等待狀態直到被通知,對中斷不做響應。 |
| long awaitNanos(long nanosTimeout) throws InterruptedException | void await() throws InterruptedException方法的超時等待版本,返回值表示當前剩余的時間,如果在nanosTimeout之前被喚醒,返回值 = nanosTimeout - 實際消耗的時間,返回值 <= 0表示超時。 |
| boolean awaitUntil(Date deadline) throws InterruptedException | 當前線程進入等待狀態直到被通知、中斷、到達某個時間點。在deadline時間點前線程能被通知或中斷則返回true,否則返回false。 |
| void signal() | 喚醒一個等待在Condition上的線程。 |
| void signalAll() | 喚醒所有等待在Condition上的線程。 |
轉載于:https://juejin.im/post/5d020a41f265da1ba25259af
總結
以上是生活随笔為你收集整理的Java并发编程的艺术(十)——Java中的锁(5)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sudo: pip:找不到命令
- 下一篇: Java:控制台输入车辆信息,将信息保存