关于java:Java并发之Condition

20次阅读

共计 1454 个字符,预计需要花费 4 分钟才能阅读完成。

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();}
    }
}

正文完
 0