首页 > 学院 > 开发设计 > 正文

JUC的Condition注意事项

2019-11-09 20:58:21
字体:
来源:转载
供稿:网友

前言

在看Condtion时候总是感觉有点晕的感觉,总结一点别的文章没有提到的地方。

正文

作用:

Condition主要是为了代替Object 监视器方法(wait、notify 和 notifyAll)。Condition 将 Object 监视器方法(wait、notify 和 notifyAll)分解成截然不同的对象,以便通过将这些对象与任意 Lock 实现组合使用,为每个对象提供多个等待 set(wait-set)。其中,Lock 替代了 synchronized 方法和语句的使用,Condition 替代了 Object 监视器方法的使用。

注意点:

Condition的时候,是为了配合Lock使用而存在的。我们看一下声明和使用时候的代码就明白了。 声明代码:

Lock lock = new ReentrantLock();Condition condition = lock.newCondition();

通过上面的声明代码可以看出来,声明Condition实例的时候,一般都是使用lock实现来声明的。

使用代码:

public class ConditionTest1 { PRivate static Lock lock = new ReentrantLock(); private static Condition condition = lock.newCondition(); public static void main(String[] args) { ThreadA ta = new ThreadA("ta"); lock.lock(); // 获取锁 try { System.out.println(Thread.currentThread().getName()+" start ta"); ta.start(); System.out.println(Thread.currentThread().getName()+" block"); condition.await(); // 等待 System.out.println(Thread.currentThread().getName()+" continue"); } catch (InterruptedException e) { e.printStackTrace(); } finally { lock.unlock(); // 释放锁 } } static class ThreadA extends Thread{ public ThreadA(String name) { super(name); } public void run() { lock.lock(); // 获取锁 try { System.out.println(Thread.currentThread().getName()+" wakup others"); condition.signal(); // 唤醒“condition所在锁上的其它线程” } finally { lock.unlock(); // 释放锁 } } }}

  从使用代码可以看出来,在使用condition.await()condition.signal()的时候,都需要有Lock.lock方法。在javadoc上也提到了,如果在使用Condition的await()signal()方法(其它方法好像也是,没有确认)时,没有持有Condition相对应的锁(也就是生成Condition的锁)的话,就会抛出IllegalMonitorStateException异常。   所以,await或signal操作,都是针对使用“生成Condtion的锁”的线程。

参考:

【Java并发编程实战】—–“J.U.C”:ConditionJava多线程系列–“JUC锁”06之 Condition条件
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表