JDK1.5中的多线程升级方案
来源:互联网 发布:win10添加网络驱动器 编辑:程序博客网 时间:2024/05/20 02:52
JDK1.5中提供了多线程升级解决方案,将synchronized替换为了显示的Lock操作。将Object中的wait、notify、notifyAll替换为了condition对象(该对象可以通过Lock锁进行获取)。
有关Lock接口以及condition对象的详细介绍请查找官方API,这里不做详细介绍,我只是想通过两个例子来对比一下synchronized和Lock。
使用synchronized的生产者和消费者关系:
class Resource {// 产品名称private String name;// 计数器private int count = 0;// 标志位,标志 生产或消费private boolean flag = false;// 生产活动public synchronized void set(String name) {// 如果flag为true,则说明已经生产还未消费,使线程进入等待状态// 循环判断,线程被唤醒后也进行判断确保产品已经消费while (flag)try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}this.name = name + "---" + ++count;System.out.println(Thread.currentThread().getName() + "...生产者..."+ this.name);// 产品已生产,flag置为trueflag = true;// 唤醒所有线程this.notifyAll();}// 消费活动public synchronized void out() {// 如果flag为false,则说明还已经消费还未生产,使线程进入等待状态// 循环判断,线程被唤醒后也进行判断确保产品已经生产while (!flag)try {wait();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}System.out.println(Thread.currentThread().getName() + "...消费者..."+ this.name);// 产品已消费,flag置为falseflag = false;// 唤醒所有线程this.notifyAll();}}// 生产者class Producer implements Runnable {private Resource res;public Producer(Resource res) {this.res = res;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {res.set("++商品++");}}}// 消费者class Consumer implements Runnable {private Resource res;public Consumer(Resource res) {this.res = res;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {res.out();}}}public class ProducerConsumer {public static void main(String[] args) {// TODO Auto-generated method stubResource resource = new Resource();Producer producer = new Producer(resource);Consumer consumer = new Consumer(resource);Thread t1 = new Thread(producer);Thread t2 = new Thread(producer);Thread t3 = new Thread(consumer);Thread t4 = new Thread(consumer);t1.start();t2.start();t3.start();t4.start();}}
使用Lock锁的生产者和消费者关系:
import java.util.concurrent.locks.Condition;import java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;class Resource {// 产品名称private String name;// 计数器private int count;// 标志位,标志 生产或消费private boolean flag = false;// 创建Lock锁private Lock lock = new ReentrantLock();// 创建condition对象private Condition condition_pro = lock.newCondition();private Condition condition_Con = lock.newCondition();// 生产活动public void set(String name) {// 上锁lock.lock();try {// 如果flag为true,则说明已经生产还未消费,使线程进入等待状态// 循环判断,线程被唤醒后也进行判断确保产品已经消费while (flag)// 线程休眠condition_pro.await();this.name = name + "---" + ++count;System.out.println(Thread.currentThread().getName() + "...生产者..."+ this.name);// 产品已生产,flag置为trueflag = true;// 唤醒所有线程condition_Con.signalAll();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 解锁,该动作一定要执行lock.unlock();}}// 消费活动public void out() {// 上锁lock.lock();try {// 如果flag为false,则说明还已经消费还未生产,使线程进入等待状态// 循环判断,线程被唤醒后也进行判断确保产品已经生产while (!flag)// 线程休眠condition_Con.await();System.out.println(Thread.currentThread().getName() + "...消费者..."+ this.name);// 产品已消费,flag置为falseflag = false;// 唤醒所有线程condition_pro.signalAll();} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 解锁,该动作一定要执行lock.unlock();}}}// 生产者class Producer implements Runnable {private Resource res;public Producer(Resource res) {this.res = res;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {res.set("++商品++");}}}// 消费者class Consumer implements Runnable {private Resource res;public Consumer(Resource res) {this.res = res;}@Overridepublic void run() {// TODO Auto-generated method stubwhile (true) {res.out();}}}public class ProducerConsumer {public static void main(String[] args) {// TODO Auto-generated method stubResource resource = new Resource();Producer producer = new Producer(resource);Consumer consumer = new Consumer(resource);Thread t1 = new Thread(producer);Thread t2 = new Thread(producer);Thread t3 = new Thread(consumer);Thread t4 = new Thread(consumer);t1.start();t2.start();t3.start();t4.start();}}
通过对比可以看出,一个Lock锁可以对应多个condition,解决了锁嵌套时出现的死锁现象。
0 0
- JDK1.5中的多线程升级方案
- 多线程通信之优化升级+JDK1.5升级版后的新方案
- 黑马程序员----JDK1.5版本中提供多线程升级解决方案
- 多线程锁升级解决方案(JDK1.5及以后)
- 黑马程序员,JDK1.5中提供了多线程升级解决方案Lock操作
- Java---20---多线程:生产者和消费者2(JDK1.5升级版)
- 多线程——线程间通信{JDK1.5升级版 Lock;Conditon}
- was ejb客户端从jdk1.5到jdk1.6升级
- javaweb项目jdk1.5升级1.6
- Jrun配置jdk1.5问题解决方案
- 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
- 深入浅出多线程(3)-Future异步模式以及在JDK1.5Concurrent包中的实现
- JDK1.5中的新特性
- JDK1.5中的线程池
- JDK1.5中的线程池
- JDK1.5中的线程池
- JDK1.5中的线程池
- jdk1.5以后的多线程同步方式
- log4j配置(详细讲解)
- Java Web乱码分析及解决方案(三)——响应乱码
- 9秒学院游戏公司内部代码规范(实用)
- 如何使用ASP.NET中的类库实现邮件的发送
- 好的软件架构设计
- JDK1.5中的多线程升级方案
- jsp怎么从数据库取数据并显示再表格上
- C++继承与多态问题
- Android开发三大规范(经验总结)
- 封装标签-2
- Android 系统稳定性 - ANR
- 用一张图片实现圆形的ProgressBar进度条
- java 各类型之间转换总结
- Android入门几个常见小问题(学习用)