黑马程序员_Java基础:实现多线程对共有数据的同步操作
------- android培训、java培训、期待与您交流! ----------
实现多线程对共有数据的同步操作,主要涉及到多线程和同步。
虽然都是基础,但是这把刀还是要用熟练,等到使用的时候才能得心应手。
以下是示例:
/*
* 需求:有生产者和消费者,生产者生产一个,消费者才能消费一个,但如果消费者不消费,也不能生产。
* 知识点:同步,多线程,等待唤醒机制,单例设计模式。*/
package com.gzjzone.jul242015; import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock; class ProducerConsumerTest {
public static void main(String[] args) {
new Thread(new Producer()).start();
new Thread(new Consumer()).start();
new Thread(new Producer()).start(); //多生产者。
new Thread(new Consumer()).start(); //多消费者。
} } class Product{
// 单例设计模式:饿汉式。
private Product(){};
private static Product product = new Product();
public static Product getProduct(){
return product;
}
private int pro = 0;
private boolean flag = false; // 同步设置
private Lock lock = new ReentrantLock();
private Condition con_pro = lock.newCondition();
private Condition con_con = lock.newCondition(); public void setPro(int pro){
this.pro = pro;
}
public void setFlag(boolean flag){
this.flag = flag;
}
public int getPro(){
return pro;
}
public boolean getFlag(){
return flag;
}
public Lock getLock(){
return lock;
}
public Condition getCon_pro(){
return con_pro;
}
public Condition getCon_con(){
return con_con;
}
} class Producer implements Runnable {
Product product = Product.getProduct();
Lock lock = product.getLock();
Condition con_pro = product.getCon_pro();
Condition con_con = product.getCon_con();
public void run() {
while (true) {
lock.lock();
try {
// 使用while循环判断标记,可以让线程被唤醒后再次判断while的条件标记。
while (product.getFlag())
con_pro.wait();
int pro = product.getPro();
System.out.println(Thread.currentThread().getName()+"生产..."+(++pro));
product.setPro(pro);
product.setFlag(true);
} catch (InterruptedException e) {
System.out.println("中断异常");
} finally{
con_con.signal();;
lock.unlock();
}
} }
} class Consumer implements Runnable {
Product product = Product.getProduct();
Lock lock = product.getLock();
Condition con_pro = product.getCon_pro();
Condition con_con = product.getCon_con();
public void run() {
while (true) {
lock.lock();
try {
while (!(product.getFlag()))
con_con.wait();
int pro = product.getPro();
System.out.println(Thread.currentThread().getName()+"消费..........."+pro--);
product.setPro(pro);
product.setFlag(false);
} catch (InterruptedException e) {
System.out.println("中断异常");
} finally{
con_pro.signal();
lock.unlock();
}
}
}
}
运行结果为多个线程不断循环生产1个,消费1个,可以看出生产行为和消费行为达到多线程同步,满足需求。
其中关键点:
1.产品是生产者和消费者的共用数据,利用单例设计模式创建产品对象,确认唯一性。
2.设置标记,通过标记来控制生产消费的次序。
黑马程序员_Java基础:实现多线程对共有数据的同步操作的更多相关文章
- 黑马程序员_Java基础:多线程总结
------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任 ...
- 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表
\day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...
- 黑马程序员_Java基础:网络编程总结
------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...
- 黑马程序员_Java基础组成
Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...
- 黑马程序员_Java基础视频-深入浅出精华版--视频列表
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-
\day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...
- 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式
—————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— GUI(Graphical User Interface)(图形用户接口):用图形 ...
- 黑马程序员_java基础笔记(04)...多线程
——————————ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— 多线程.第一重点:创建线程的两种方式.第二重点:同步的所有特性 进程:正在执 ...
- 黑马程序员_Java基础:IO流总结
------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...
随机推荐
- 洛谷P3366 【模板】最小生成树
P3366 [模板]最小生成树 319通过 791提交 题目提供者HansBug 标签 难度普及- 提交 讨论 题解 最新讨论 里面没有要输出orz的测试点 如果你用Prim写了半天都是W- 题目 ...
- Android软件更新安装。
app的开发有一个问题是避免不了的,那就是软件的升级维护. 这里我在查过一些资料和写了一个升级帮助类.使用很方便.直接导入就可以了. ( VersionBean.class为更新地址返回的数据对象,我 ...
- CSS子元素居中(父元素宽高已知,子元素未知)
<style> .container{width:400px; height:400px; position:relative;} .center{position:absolute; l ...
- NHibernate系列文章九:NHibernate对象二级缓存上
摘要 NHibernate的二级缓存由SessionFactory管理,由所有Session共享. NHibernate缓存读取顺序: 首先从一级缓存中读取,如果一级缓存对象存在,则读取一级缓存对象并 ...
- js按Enter键提交表单
function exprint(e){ /* var keycode = event.keyCode; if (keycode == "13"){ fm.UserCode.foc ...
- DescriptionResourcePathLocationType Dynamic Web Module 3.0 requires Java
先保证ide的所有jdk都在1.6及以上,如果还是错就试试下面的 在<build></build>中添加 <plugins> <plugin> < ...
- Android源代码结构分析
Google提供的Android包含了:Android源代码,工具链,基础C库,仿真环境,开发环境等,完整的一套.第一级别的目录和文件如下所示:----------------├── Makefile ...
- Func的介绍
经常看到 Func<int, bool>...这样的写法,看到这样的就没有心思看下去了.我们学技术还是需要静下心来. 对Func<int,bool>的Func转到定义看它的解 ...
- LR录制https协议报证书错误,导航已阻止
使用IE浏览器录制https协议报证书错误,导航已阻止,修改如下配置文件:
- spring junit
转载自 http://blog.csdn.net/funi16/article/details/8691575 在写单元测试的时候,一般是对数据库进行增删改查的操作,这个时候,如果之前删除了某条记录, ...