在JDK1.5发布后,提供了Synchronized的更优解决方案:Lock 和 Condition

我们使用这些新知识,来改进例子:【多线程】--生产者消费者模式--Synchronized版本

改进代码如下:

package com.shindo.java.thread;
import java.util.concurrent.locks.*;
/**
* Jdk 1.5中,提供了多线程升级解决办法
* 将同步Synchronized 替换为显示的Lock操作
* 将Object中的wait、notify、notifyAll替换为Condition对象
* 该对象通过Lock锁进行获取
* 一个锁Lock上可以有多个相关的Condition对象
*/
public class ProducerAndConsumerPatternBetter {
public static void main(String[] args){
Resource2 r = new Resource2();
new Thread(new Producer2(r)).start();
new Thread(new Consumer2(r)).start();
}
} /**
* 定义资源类,负责提供商品的生产方法和消费方法
*/
class Resource2 {
//定义商品变量
private String name;
//定义自增长计数器
private int count = 1;
//定义逻辑标志位
private boolean flag = false;
//通过多态的方法,生成Lock对象的实例
private Lock lock = new ReentrantLock();
//定义生产者的Condition对象
private Condition condition_pro = lock.newCondition();
//定义消费者的Condition对象
private Condition condition_con = lock.newCondition(); //定义产品生产方法
public void set(String name) throws InterruptedException{
lock.lock();
try {
while(flag)
condition_pro.await();
this.name = name + "=="+ count++;
System.out.println(Thread.currentThread().getName() + "--生产者--"+ this.name);
flag = true;
condition_con.signal();
}finally{
lock.unlock();
}
} //定义产品消费方法
public void out()throws InterruptedException{
lock.lock();
try {
while(!flag)
condition_con.await();
System.out.println(Thread.currentThread().getName()+"--##消费者##--"+this.name);
flag = false;
condition_pro.signal();
} finally{
lock.unlock();
}
}
} /**
* 定义产品生产类
*/
class Producer2 implements Runnable{
private Resource2 res;
Producer2(Resource2 res){
this.res = res;
}
public void run(){
while(true){
try {
res.set("商品");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
} //定义产品消费类
class Consumer2 implements Runnable{
private Resource2 res;
Consumer2(Resource2 res){
this.res = res;
}
public void run(){
while(true){
try {
res.out();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}

代码执行结果如下图:

【多线程】--生产者消费者模式--Lock版本的更多相关文章

  1. java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-【费元星Q9715234】

    java+反射+多线程+生产者消费者模式+读取xml(SAX)入数据库mysql-[费元星Q9715234] 说明如下,不懂的问题直接我[费元星Q9715234] 1.反射的意义在于不将xml tag ...

  2. 【多线程】--生产者消费者模式--synchronized版本

    在实现生产者消费者模式之前,我们先了解一下线程的5种状态:被创建.运行.冻结.消亡.阻塞,如下图: 在Jdk1.5发布之前,我们实现生产者消费者模式一般使用synchronized + while循环 ...

  3. Java实现多线程生产者消费者模式的两种方法

    生产者消费者模式:生产者和消费者在同一时间段内共用同一存储空间,生产者向空间里生产数据,而消费者取走数据.生产者生产一个,消费者消费一个,不断循环. 第一种实现方法,用BlockingQueue阻塞队 ...

  4. java多线程 生产者消费者模式

    package de.bvb; /** * 生产者消费者模式 * 通过 wait() 和 notify() 通信方法实现 * */ public class Test1 { public static ...

  5. java实现多线程生产者消费者模式

    1.概念 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理,直接扔给阻塞队列,消 ...

  6. 多线程-生产者消费者(lock同步)

    二.采用Lock锁以及await和signal方法是实现 import java.io.IOException; import java.util.concurrent.locks.Condition ...

  7. .net学习之多线程、线程死锁、线程通信 生产者消费者模式、委托的简单使用、GDI(图形设计接口)常用的方法

    1.多线程简单使用(1)进程是不执行代码的,执行代码的是线程,一个进程默认有一个线程(2)线程默认情况下都是前台线程,要所有的前台线程退出以后程序才会退出,进程里默认的线程我们叫做主线程或者叫做UI线 ...

  8. Java多线程-----实现生产者消费者模式的几种方式

       1 生产者消费者模式概述 生产者消费者模式就是通过一个容器来解决生产者和消费者的强耦合问题.生产者和消费者彼此之间不直接通讯,而通过阻塞队列来进行通讯,所以生产者生产完数据之后不用等待消费者处理 ...

  9. 【多线程】java多线程实现生产者消费者模式

    思考问题: 1.为什么用wait()+notify()实现生产者消费者模式? wait()方法可以暂停线程,并释放对象锁 notify()方法可以唤醒需要该对象锁的其他线程,并在执行完后续步骤,到了s ...

随机推荐

  1. 使用openCV的静态库编译

    转载请注明出处: http://www.cnblogs.com/sysuzyq/p/6183568.html By 少侠阿朱 摘要: 本文主要讲述如何使用opencv静态库进行编译,生成脱离openc ...

  2. 找工作笔试面试那些事儿(10)---SQL语句总结

    SQL语句中常用关键词及其解释如下: 1)SELECT 将资料从数据库中的表格内选出,两个关键字:从 (FROM) 数据库中的表格内选出 (SELECT).语法为 SELECT "栏位名&q ...

  3. android_launcher的源码详细分析

    转载请注明出处:http://blog.csdn.net/fzh0803/archive/2011/03/26/6279995.aspx 去年做了launcher相关的工作,看了很长时间.很多人都在修 ...

  4. Centos7安装Oracle JDK

    查看Linux是否自带的JDK,如有openJDK,则卸载 java -version

  5. Oracle数据库的创建与验证

    创建数据库,输入命令dbca创建数据库 会弹出创建数据库相应的对话框 单击下一步 选择创建一个数据库,并单击下一步 数据库模板选择一般目的的转换过程即可.单击下一步 全局数据库名称和SID名称,要和上 ...

  6. 黑马程序员——Java高级应用(一)

    ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS ...

  7. asp.net事件委托易理解实例

    比如说一个公司(场景),你是老板,手下有两个员工,小张和小王. 你命令小王,如果小张玩游戏,则小王扣去小张500元钱.这就是现实中的委托.实际上,在写程序中,程序员就是老板,小张和小王就是两个对象.小 ...

  8. MS-DOS命令列表

    以下是微软的DOS操作系统(MS-DOS)的DOS命令列表.其它DOS的命令和用法可能类似. 后期版本的 DOS 可以通过help命令来得到命令与参数列表,通过help <命令>或者< ...

  9. 我永远的 dell 15r

    陪伴我三年多的15r  让我疯狂过.努力过.更记录了我很多的成长,与很多个瞬间.看到它是有感情的.还记得第一次失去她.我好像失去了自己. 我是一个程序员.每个程序员都有自己的环境配置.不同的软件.就是 ...

  10. kafka的一些常用命令

    启动zookeeper bin/zookeeper-server-start.sh config/zookeeper.properties & 启动kafka bin/kafka-server ...