Java并发显式锁和显式条件队列

欢迎进入Java社区论坛,与200万技术人员互动交流 >>进入

  使用notify的情况仅仅同时满足“所有等待线程都是等待相同的条件谓词”和“每次最多只能唤醒一个线程来执行”。

  ReentrantLock是Lock的子类,它是一种广义的内置锁,Condition则是一种广义的内置条件队列。由于多个线程可能会在同一个条件队列中等待不同的条件谓词,有时候为了方便的进行管理,可以针对不同的条件谓词设置不同的条件队列来等待。

  一般一个Condition和一个Lock关联在一起,就是如同一个内置锁和内置条件队列关联在同一个对象中。一般创建Condition,就是在需要关联的Lock上调用Lock.newCondition方法。一个Lock则可以对应多个Condition对象。在Condition中,与Object中wait,notify,notifyAll所对应的方法分别为await,signal,signalAll。

  显式的Condition和内置条件队列的选择:

  一般还是选择内置条件队列,当需要使用公平队列或在每个锁上对应多个等待线程集的时候,就可以运用Condition了

  代码实例:一个利用Condition和Lock来实现的有界缓存,里面有两种条件队列

package whut.usersynchrnoized;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;//利用Condition和Lock来实现有界缓存public class ConditionBoundedBuffer<T> { private final Lock lock = new ReentrantLock(); private final Condition full = lock.newCondition(); private final Condition empty = lock.newCondition(); private final T[] items; private int tail, head, count; public ConditionBoundedBuffer(int size) { items = (T[]) new Object[size]; } // 阻塞直到notfull public void put(T x) throws InterruptedException { lock.lock(); try { while (count == items.length) full.await();// 满了,则要在full条件队列中等待 items[tail] = x; if (++tail == items.length) tail = 0; ++count; empty.signal();// 每次唤醒一个线程 } finally { lock.unlock(); } } // 阻塞直到notEmpty public T take() throws InterruptedException { lock.lock(); try { while (count == 0) empty.await();// 空了,则要在empty条件队列中等待 T x = items[tail]; items[tail] = null; if (++head == items.length) head = 0; –count; full.signal();// 每次唤醒一个线程 return x; } finally { lock.unlock(); } }}

[1][2]

成功是什么?就是走过了所有通向失败的路,

Java并发显式锁和显式条件队列

相关文章:

你感兴趣的文章:

标签云: