java并发编程之三

LockSupport工具

LockSupport定义了一组公共静态方法,这些方法提供了最基本的的线程阻塞和唤醒功能。其他类实现阻

塞和唤醒都会调用它。

Condition接口

类似java对象的等待/通知功能。回忆一下synchronized关键字的使用,利用java对象,实现锁的获取和释放

synchronized(object){

try{

object.await();

//object.notify();

}finally{

//...

}

}

在synchronized开始时获取锁,在结束处和其他必要的地方释放锁。还可以调用java对象去等待,等待是要

放弃锁的,当该线程被中断或者是被唤醒且获得锁后,会从await()中返回,其中等待中被中断,是抛异常

而从await()方法返回,所以需要用try包围await(),捕捉中断异常,上篇文章说过抛出中断异常其实是响应

中断的表现。调用await()和notify()时,如果该线程没有获得锁,则会抛出IllegalMonitorStateException。

所以都是在synchronized同步块中调用等待/通知的方法的。

而Condition是负责等待/通知部分的,而不负责获取和释放锁的实现的。即Conditon只负责管理等待队列,

但是Condition依赖Lock。

Object的等待/通知的相关方法和Condition接口对比,Condition更强大。一个Lock可以对应多个Condition,

也就是一个锁可以对应了多个等待队列,后面会说说一对多的意义。Condition增加了等待过程中不响应

中断的支持,定时从等待中返回的支持。

Condition使用实例

Lock lock = new ReentrantLock();
  Condition condition =  lock.newCondition();
    public void conditionWait() throws InterruptedException, IllegalMonitorStateException{
        lock.lock();
        try {
            condition.await();//注意要在获得condition对应的锁后才调用await
        } finally {
            lock.unlock();//在最后需要释放锁
        }
    }
    
    public void conditionSignal() throws InterruptedException, IllegalMonitorStateException{
        lock.lock();
        try {
            condition.signal();//注意要在获得condition对应的锁后才调用signal
        } finally {
            lock.unlock();//在最后需要释放锁
        }
    }

一个Lock对应多个Condition的意义

由生产者和消费者的例子可知,分别对同一变量作加1减1,需要有同步,

而而这个变量是一种资源,而Lock代表是一种资源(可以有多个同类资源由同一个锁控制,根据资源数定义

同步变量即可),而该锁对应的不同等待队列中节点表示不同的工作性质的线程,如生产者和消费者就是不同

工作性质,即对资源的不同操作。如果有多个生产者和多个消费者,用synchronized关键字是不能很好的实

现的,只能实现只有一个消费者和一个生产者的情况,因为一个等待队列无法区分开不同工作性质的线程。

Condition的实现

等待队列

等待队列是一个FIFO队列。同步队列和等待队列中的节点类型都是同步器的静态内部类。一个Condition包

括一个等待队列。队列的插入和移除都没有使用CAS,因为这些过程是都会检查是否持有锁,由锁来保证线

程安全。在Object的监视器模型中,一个对象拥有一个同步队列和等待队列,而并发包中的Lock拥有多个等

待队列和一个同步队列

等待

调用await()方法,使当前线程进入等待队列,然后释放锁,同时线程状态变为等待状态(阻塞)。

通知

调用Condition的signal()方法,将会唤醒在等待队列中等待时间最长的节点(首节点),在唤醒队列之前,

会将节点移到同步队列中


-----------------------------------------------------------------------------------------------------------------------------------------------

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值