Java并发编程的艺术(十)——Java中的锁(5)

277 阅读2分钟

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上的线程。