------- 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基础:实现多线程对共有数据的同步操作的更多相关文章

  1. 黑马程序员_Java基础:多线程总结

    ------- android培训.java培训.期待与您交流! ---------- 一.多线程的概念 进程和线程经常会被人混淆,那是因为对它们的概念不明确.就拿我们平时使用的操作系统来说,它是多任 ...

  2. 黑马程序员_Java基础视频-深入浅出精华版--PPT 文件列表

    \day01\code\第一章_Java概述.ppt;\day01\resource\资料\50道编程题(有精力的同学看看).doc;\day01\resource\资料\Sun_Java程序员认证考 ...

  3. 黑马程序员_Java基础:网络编程总结

    ------- android培训.java培训.期待与您交流! ---------- Java语言是在网络环境下诞生的,它是第一个完全融入网络的语言,虽然不能说它是对支持网络编程做得最好的语言,但是 ...

  4. 黑马程序员_Java基础组成

    Java语言基础组成 2.1关键字 main不是关键字,但被JVM所识别的名称. 关键字的定义和特点 定义:被Java语言赋予了特殊含义的单词. 特点:关键字中所有字母都为小写. 用于定义数据类型的关 ...

  5. 黑马程序员_Java基础视频-深入浅出精华版--视频列表

    \day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...

  6. 课程2:《黑马程序员_Java基础视频-深入浅出精华版》-视频列表-

    \day01\avi\01.01_计算机基础(计算机概述).avi; \day01\avi\01.02_计算机基础(计算机硬件和软件概述).avi; \day01\avi\01.03_计算机基础(软件 ...

  7. 黑马程序员_java基础笔记(08)...GUI,网络编程,正则表达式

    —————————— ASP.Net+Android+IOS开发..Net培训.期待与您交流! —————————— GUI(Graphical User Interface)(图形用户接口):用图形 ...

  8. 黑马程序员_java基础笔记(04)...多线程

    ——————————ASP.Net+Android+IOS开发..Net培训.期待与您交流!—————————— 多线程.第一重点:创建线程的两种方式.第二重点:同步的所有特性      进程:正在执 ...

  9. 黑马程序员_Java基础:IO流总结

    ------- android培训.java培训.期待与您交流! ---------- IO流在是java中非常重要,也是应用非常频繁的一种技术.初学者要是能把IO技术的学透,java基础也就能更加牢 ...

随机推荐

  1. 剑指Offer:面试题25——二叉树中和为某一值的路径(java实现)

    问题描述: 输入一棵二叉树和一个整数,打印出二叉树中结点指的和为输入整数的所有路径.从树的根结点开始往下一直到叶结点所经过的结点形成一条路径.二叉树结点的定义如下: public class Tree ...

  2. JAVA 多线程和并发学习笔记(二)

    一.Java中创建线程方法 1. 继承Thread类创建线程类 定义Thread类的子类,重写该类的run()方法.该方法为线程执行体. 创建Thread子类的实例.即线程对象. 调用线程对象的sta ...

  3. PIC32MZ tutorial -- Timer Interrupt

    An interrupt is an internal or external event that requires quick attention from the controller. The ...

  4. linux网络完全与防护

    7.1 网络封包联机进入主机的流程   7.1.1 封包进入主机的流程 1.经过防火墙的分析 iptables 主要功能是封包过滤 主要分析TCP/IP的封包表头来进行过滤的机制 分析的是OSI的第二 ...

  5. VC++ 动态创建单个工具条,并加载外部的位图(bmp)文件为工具栏图像

    步骤: 1, 在框架类CMainFrame头文件里,增加图像变量和工具条变量. CMFCToolBarImages m_UserImages; CMFCToolBar m_wndToolBar; 2, ...

  6. javascript中的innerHTML是什么意思,怎么个用法?

    innerHTML在JS是双向功能:获取对象的内容 或 向对象插入内容:如:<div id="aa">这是内容</div> ,我们可以通过 document ...

  7. artDialog测试

    artDialog测试 <script src="../Content/artDialog/v4/artDialog.source.js?skin=default">& ...

  8. 记一次 Ubuntu 使用 arptables 抵御局域网 ARP 攻击

    . . . . . 前段时间大概有一个月左右,租房的网络每天都断一次,每次断大概一两分钟左右就恢复了,所以没太在意.直到有一天晚上,LZ 正在写博客,但是网络频繁中断又重新连上再中断.待 LZ 好不容 ...

  9. SQL语句-批量插入表(表数据插表)

    批量插入表(表数据插表) ****1.INSERT INTO SELECT语句语句形式为:Insert into Table2(field1,field2,...) select value1,val ...

  10. GridView中 LinkButton两种方式

    <asp:TemplateField HeaderText="操作" ShowHeader="False"> <ItemTemplate> ...