博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java并发编程的艺术(十)——Java中的锁(5)
阅读量:7063 次
发布时间:2019-06-28

本文共 2002 字,大约阅读时间需要 6 分钟。

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

你可能感兴趣的文章
Web前端开发面试题赋答案
查看>>
javascript创建对象的几种方式
查看>>
yarn.resourcemanager.ha.id设置
查看>>
主动调用其他类的成员, 特殊成员
查看>>
vim操作
查看>>
ASUS主板ALC887声卡,RTL81XX网卡,黑苹果驱动安装
查看>>
POJ 2251 Dungeon Master (三维BFS)
查看>>
C# 怎样判断 datagridview 中的checkbox列是否被选中
查看>>
嵌入式系统中地址的概念
查看>>
Linux 驱动编程知识
查看>>
网络基础, 进度条, 计算文件大小, shutil模块,
查看>>
Entity Framework 4 in Action读书笔记——第四章:使用LINQ to Entities查询:投影结果...
查看>>
新春快乐
查看>>
django框架的基础知识点《叁》
查看>>
面试题:数据库 已看1 各种优化 数据库引擎 有用
查看>>
html --- rem 媒体查询
查看>>
分享一下自己用c++写的小地图
查看>>
马尔可夫模型
查看>>
bzoj 1697: [Usaco2007 Feb]Cow Sorting牛排序
查看>>
js面向对象编程
查看>>