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
- java5中Lock与Condition的应用
- java5条件阻塞Condition的应用-多路等待通知Lock-Condition使用-笔记整理10
- java5条件阻塞Condition的应用(十三)
- 黑马程序员-java5的线程锁技术Lock,Condition
- 线程高级应用-心得5-java5线程并发库中Lock和Condition实现线程同步通讯
- Lock中Condition的实现
- 【Java多线程与并发库】11.java5条件阻塞Condition的应用
- java5条件阻塞condition的应用(1)
- 线程高级应用-心得7-java5线程并发库中阻塞队列Condition的应用及案例分析
- JDK1.5中LOCK,Condition的使用
- python中threading的高级函数应用解析 Lock Rlock Condition Semaphore Timer Event Semaphore对象
- Lock与Condition应用(三个线程之间通信问题)
- Java5 多线程(三)--Lock和Condition实现线程同步通信
- Java5 多线程(三)--Lock和Condition实现线程同步通信
- Java5 多线程(三)--Lock和Condition实现线程同步通信
- Java5 多线程--Lock和Condition实现线程同步通信
- Lock的Condition使用
- java5线程 Callable与Future的应用
- typedef使用大全(指向函数的指针)
- xml里面的修饰符号
- 开始学习
- windows下cocos2dx 2.2.x编译安卓工程
- C#开发之简单的日志打印类
- java5中Lock与Condition的应用
- 【java】itoo项目实战之常见问题一
- 出色的移动线框图设计工具
- 链表---约瑟夫问题
- ***1240 Ivan的阿柒工作室 解题报告
- 典型相关分析
- 选出需要rebuild的索引
- 【第10篇】通过json-lib的JsonConfig去读取对象数据json
- Linux常用命令-网络