JUC并发编程:Condition的简单理解与使用

简介: JUC并发编程:Condition的简单理解与使用

1:概述

 Condition本质上是一个接口,Condition因素与Object监视器方法( wait , notify和notifyAll )成不同的对象,以得到具有多个等待集的每个对象,通过将它们与使用任意的组合的效果Lock个实现。 Lock替换synchronized方法和语句的使用, Condition取代了对象监视器方法的使用。

       条件(也称为条件队列或条件变量 )为一个线程暂停执行(“等待”)提供了一种方法,直到另一个线程通知某些状态现在可能为真。 因为访问此共享状态信息发生在不同的线程中,所以它必须被保护,因此某种形式的锁与该条件相关联。 等待条件的关键属性是它原子地释放相关的锁并挂起当前线程,就像Object.wait 。

一个Condition实例本质上绑定到一个锁。 要获得特定Condition实例的Condition实例,请使用其newCondition()方法。

2:举例

例1:

    假设我们有一个有限的缓冲区,它支持put和take方法。 如果在一个空的缓冲区尝试一个take ,则线程将阻塞直到一个项目可用; 如果put试图在一个完整的缓冲区,那么线程将阻塞,直到空间变得可用。 我们希望在单独的等待集中等待put线程和take线程,以便我们可以在缓冲区中的项目或空间可用的时候使用仅通知单个线程的优化。 这可以使用两个Condition实例来实现。

 class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 
   final Object[] items = new Object[100];
   int putptr, takeptr, count;
   public void put(Object x) throws InterruptedException {
     lock.lock(); try {
       while (count == items.length)
         notFull.await();
       items[putptr] = x;
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally { lock.unlock(); }
   }
   public Object take() throws InterruptedException {
     lock.lock(); try {
       while (count == 0)
         notEmpty.await();
       Object x = items[takeptr];
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally { lock.unlock(); }
   }
 } 

例子2:

假设我们要求3个线程,第一个打印A,第二个线程打印b ,第三个线程打印c,要求按照顺序执行

8ea5b56a9fef4fb1946d9aa5d1974911.png

3:condition 的一些方法

void await()

导致当前线程等到发信号或 interrupted

boolean await(long time, TimeUnit unit)

使当前线程等待直到发出信号或中断,或指定的等待时间过去。

long awaitNanos(long nanosTimeout)

使当前线程等待直到发出信号或中断,或指定的等待时间过去

void awaitUninterruptibly()

使当前线程等待直到发出信号。

boolean awaitUntil(Date deadline)

使当前线程等待直到发出信号或中断,或者指定的最后期限过去。

void signal()

唤醒一个等待线程。

void signalAll()

唤醒所有等待线程

目录
相关文章
|
7月前
|
安全 Java 编译器
高并发编程之什么是 JUC
高并发编程之什么是 JUC
61 1
|
安全 Java
JUC第八讲:Condition源码分析
JUC第八讲:Condition源码分析
|
7月前
|
存储 安全 算法
掌握Java并发编程:Lock、Condition与并发集合
掌握Java并发编程:Lock、Condition与并发集合
53 0
|
7月前
|
缓存 算法 Java
JUC并发编程之CAS
CAS,即Compare and Swap,是一种并发编程中用于实现多线程环境下的原子操作的技术。它是一种无锁算法,用于解决多线程环境下的数据同步问题。CAS操作包含三个操作数:内存位置V,旧的预期值A和即将要写入的新值B。只有当内存位置的值与旧的预期值A相等时,才会将新值B写入内存位置V,否则不执行任何操作。CAS操作是原子的,保证了多线程环境下的数据一致性和线程安全性。
|
7月前
|
缓存 安全 Java
JUC并发编程之volatile详解
Java内存模型是Java虚拟机(JVM)规范中定义的一组规则,用于屏蔽各种硬件和操作系统的内存访问差异,保证多线程情况下程序的正确执行。Java内存模型规定了线程之间如何交互以及线程和内存之间的关系。它主要解决的问题是可见性、原子性和有序性。
104 0
|
安全 Java 调度
JUC并发编程(上)
JUC并发编程(上)
74 0
|
存储 缓存 监控
JUC并发编程(下)
JUC并发编程(下)
42 0
|
安全 Java 编译器
JUC 并发编程
JUC 并发编程
Juc并发编程08——Condition实现源码分析
看看ReentrantLock中的newCondition方法
Juc并发编程08——Condition实现源码分析
|
存储 安全 Java
JUC并发编程超详细详解篇(二)
JUC并发编程超详细详解篇
182 0
JUC并发编程超详细详解篇(二)