java并发编程之三

来源:互联网 发布:网络吞吐量是什么意思 编辑:程序博客网 时间:2024/05/16 15:06

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()方法,将会唤醒在等待队列中等待时间最长的节点(首节点),在唤醒队列之前,

会将节点移到同步队列中


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

原创粉丝点击