在多线程安全中,使用较多的例子是生产者和消费者模型。
在这个模型中,生产者和消费者是两个独立的线程,但是他们操作的资源的共享的,生产者生产产品,消费者消费产品。假设资源用一个对象来抽象,该对象的set()和out()方法对应生产和消费,那么为了保证多线程安全,每次只能有一个生产者线程生产产品,即只有一个生产者线程可以调用set()函数,同样,每次只能有一个消费者消费产品,即只有一个消费者线程能调用out()函数,所以要加入同步机制,使用synchronized构造同步函数,或者使用jdk1.5之后的新特性,使用java.util.concurrent.locks包中的ReentrantLock和Condition来实现。
Lock和Condition都是接口,Lock接口的方法比如lock()和unlock()代替了synchronized,Condition代替了Object监视器方法的使用。Condition子类对象是通过Lock的newCondiiton()产生的。Condition中有await()、signal()、signalAll()方法,分别代替Object中的wait()、notify()、notifyAll()。
新旧特性对比:
1)Lock的lock()和unlock()可以显式地加锁和解锁,而synchronized关键字并不能显式的加解锁。
2)旧特性中,notify()和wait()必须对应一个锁才能进行唤醒操作,synchronized只对应一个锁,但是新特性中,一个Lock可以对应多个锁,可以创建多个监视器,每个监视器都可以进行线程的等待和唤醒操作,更灵活。
代码