java5中Lock与Condition的应用

来源:互联网 发布:红磷分析纯价格淘宝 编辑:程序博客网 时间:2024/05/23 20:17

在多线程中,相信大家对synchronized和Object类中的notify和wait方法并不陌生。那么Lock正是替代了synchronized关键字的使用,Condition 替代了Object 监视器方法(wait、notify和notifyAll)的使用。Lock的原理其实和synchronized是一样的。但是Lock实现提供了比使用synchronized方法和语句可获得的更广泛的锁定操作。此实现允许更灵活的结构,可以具有差别很大的属性,可以支持多个相关的Condition 对象。


下面,我将用一个实例来展现它的强大之处。代码如下:


package hxl.insist;import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;/** * 这个类的目的是演示我们同时开启三个线程,让 * 第一个线程循环10次,接着第二个线程循环10 * 次,再接着第三个线程循环10次,如此循环20次 * @author hanxl */public class ConditionCommunication {/** * 主函数入口 */public static void main(String[] args) {final Business business = new Business();new Thread(new Runnable() {@Overridepublic void run() {for (int j = 1; j <= 20; j++) {business.first(j);}}}).start();new Thread(new Runnable() {@Overridepublic void run() {for (int j = 1; j <= 20; j++) {business.second(j);}}}).start();for (int j = 1; j <= 20; j++) {business.third(j);}}static class Business {final Lock lock = new ReentrantLock();final Condition first  = lock.newCondition(); final Condition second = lock.newCondition(); final Condition third = lock.newCondition();private int flag = 1;public void first(int i) {//给下面的代码上锁,防止高并发时出现安全问题lock.lock();try {while (!(flag == 1)) {try {first.await();} catch (InterruptedException e) {e.printStackTrace();}}for (int j = 1; j <= 10; j++) {System.out.println("我是第一个线程,这是第" + j + "次循环;" + "完成了第" + i + "回合循环。");}flag = 2;second.signal();} finally {lock.unlock();}}public void second(int i) {//给下面的代码上锁,防止高并发时出现安全问题lock.lock();try {while (!(flag == 2)) {try {second.await();} catch (InterruptedException e) {e.printStackTrace();}}for (int j = 1; j <= 10; j++) {System.out.println("我是第二个线程,这是第" + j + "次循环;" + "完成了第" + i + "回合循环。");}flag = 3;third.signal();} finally {lock.unlock();}}public void third(int i) {//给下面的代码上锁,防止高并发时出现安全问题lock.lock();try {while (!(flag == 3)) {try {third.await();} catch (InterruptedException e) {e.printStackTrace();}}for (int j = 1; j <= 10; j++) {System.out.println("我是第三个线程,这是第" + j + "次循环;" + "完成了第" + i + "回合循环。");}flag = 1;first.signal();} finally {lock.unlock();}}}}

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

0 0
原创粉丝点击