黑马程序员_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基础也就能更加牢 ...
随机推荐
- springMVC使用与生成序列号
springMVC使用与生成序列号 我是以springMVC的方式提供序列号 代码可以直接在项目中用 第一步:controller类 @Autowired private PkGenerator pk ...
- 元素JS拖动的实现
涉及到了几个位置的属性 offset clientX cilentY 等 $(selector).on("mousedown",function (e){ var x = e. ...
- Remark
// create by kim 20140805 public void Remark_insertChangeHeader(Editor e) { userinfo userInfo; ; e.u ...
- FIO使用指南
前言 fio是测试IOPS的非常好的工具,用来对硬件进行压力测试和验证,支持13种不同的I/O引擎,包括:sync,mmap, libaio, posixaio, SG v3, splice, nul ...
- display:inline-block左右元素上下不对齐
今天做了两个inline-block元素,出现左右两个元素顶端出现上下不对齐的情况(下图): 解决办法: 把应用 inline-block的元素加上 vertical-align: top; .CSS ...
- 【转】操作权限不够?教你开启Win7管理员帐户
在Win7中进行一些设置,或修改某些文件时,经常会弹出当前帐户没有操作权限的提示,即使已经是管理员账户也不行.事实上,出于安全方面的考虑,默认情况下Win7系统的系统管理员Administrator账 ...
- 使用apache-jMeter出现乱码问题。
服务器字符(utf-8)正常,但是在使用apache-jMeter的时候,得到的数据会乱码.所以我们需要设置jmeter的字符编码.默认为ISO-8859-1. 进入jmeter.bat文件夹,有个j ...
- mysql修改列名字段类型
mysql> alter table lesson change title title varchar(100) charset utf8;
- eclipse 删除所有注释及空白行
Ctrl+F 删除java注释: /\*{1,2}[\s\S]*?\*/ Ctrl+F 删除xml注释: <!-[\s\S]*?--> Ctrl+F 删除空白行: ^\s*\n 选 ...
- Brn系列网上商城数据库说明文档
单店版BrnShop_1.9.351数据字典:点击下载 多店版BrnMall_1.9.496数据字典:点击下载 有对网上商城程序设计感兴趣的朋友,欢迎加入QQ群:235274151,大家可以交流下!