关于java:Java并发之Condition

Condition的认知

  • 在应用Lock之前,咱们应用的最多的同步形式应该是synchronized关键字来实现同步形式了。配合Object的wait()、notify()系列办法能够实现期待/告诉模式。
  • Condition接口也提供了相似Object的监视器办法,与Lock配合能够实现期待/告诉模式,然而这两者在应用形式以及性能个性上还是有差异的。Object和Condition接口的一些比照。摘自《Java并发编程的艺术》

Condition接口的介绍与示例

首先咱们须要明确condition对象是依赖于lock对象的,意思就是说condition对象须要通过lock对象进行创立进去(调用Lock对象的newCondition()办法)。condition的应用形式十分的简略。然而须要留神在调用办法前获取锁。
调用示例

/**
 * condition应用示例: * 1、condition的应用必须要配合锁应用,调用办法时必须要获取锁 * 2、condition的创立依赖于Lock lock.newCondition(); */
 public class ConditionUseCase {
    /**
 * 创立锁 */ public Lock readLock = new ReentrantLock();
 /**
 * 创立条件 */ public Condition condition = readLock.newCondition();
 public static void main(String[] args) {
        ConditionUseCase useCase = new ConditionUseCase();
 ExecutorService executorService = Executors.newFixedThreadPool(2);
 executorService.execute(() -> {
            //获取锁进行期待
 useCase.conditionWait();
 });
 executorService.execute(() -> {
            //获取锁进行唤起读锁
 useCase.conditionSignal();
 });
 }
    /**
 * 期待线程 */ public void conditionWait() {
        readLock.lock();
 try {
            System.out.println(Thread.currentThread().getName() + "拿到锁了");
 System.out.println(Thread.currentThread().getName() + "期待信号");
 condition.await();
 System.out.println(Thread.currentThread().getName() + "拿到信号");
 } catch (Exception e) {
        } finally {
            readLock.unlock();
 }
    }
    /**
 * 唤起线程 */ public void conditionSignal() {
        readLock.lock();
 try {
            //睡眠5s 线程1启动
 Thread.sleep(5000);
 System.out.println(Thread.currentThread().getName() + "拿到锁了");
 condition.signal();
 System.out.println(Thread.currentThread().getName() + "发出信号");
 } catch (Exception e) {
        } finally {
            //开释锁
 readLock.unlock();
 }
    }
}

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理