重入锁的搭档:Condition

Condition的作用和obj.wait和obj.notify的作用大致相同。只不过wait和notify方法和synchronized关键字合作使用,而Condition是与重入锁相关联的。
通过ReentrantLock.newCondition方法可以生成一个与当前重入锁绑定的Condition实例对象,利用Condition对象,我们可以让线程在合适的时间等待,或者在某一时刻得到通知继续执行。
Condition接口提供的方法如下:

 void await() throws InterruptedException;
 void awaitUninterruptibly();
 long awaitNanos(long nanosTimeout) throws InterruptedException;
 boolean await(long time, TimeUnit unit) throws InterruptedException;
 boolean awaitUntil(Date deadline) throws InterruptedException;
 void signal();
 void signalAll();

await()会使当前线程等待,同时释放当前锁。当其他线程调用signal方法或者signalAll方法时,线程会重新获得锁并继续执行。或者当前线程被中断时,也能跳出等待。与obj.wait方法相似。
awaitUninterruptibly()与await()方法相似,当时他不会在等待过程中响应中断。
使用实例:

public class ConditionDemo implements Runnable{
    private static ReentrantLock lock=new ReentrantLock();
    private static Condition condition=lock.newCondition();

    @Override
    public void run() {
        try {
            lock.lock();
            condition.await();
            System.out.println("Thread is await");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }finally {
            lock.unlock();
        }
    }

    public static void main(String[] args) throws InterruptedException {
        Thread t1=new Thread(new ConditionDemo());
        t1.start();
        Thread.sleep(1000);
        lock.lock();
        condition.signalAll();
        lock.unlock();
    }
}

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容