[javaSE] 并发编程(线程间通信)
新建一个资源类Resource
定义成员变量String name
定义成员变量int age
新建一个输入类Input,实现Runnable接口
定义一个构造方法Input(),传入参数:Resource对象
实现run()方法
定义while(true)往Resuorce对象的属性赋值
新建一个输出类Output,实现Runnable接口
定义一个构造方法Output(),传入参数:Resource对象
实现run()方法
定义while(true)打印Resuorce对象的属性
main方法中
获取Resource对象,new出来
获取Input对象,new出来,构造参数:Resource对象
获取Output对象,new出来,构造参数:Resource对象
获取Thread对象,new出来,构造参数:Runnable对象
调用Thread对象的start()方法,开启线程
此时会有线程安全问题,查看结果可以发现,汉字和拼音的混了
陶士涵=====男
taoshihan=====nan
陶士涵=====nan
陶士涵=====nan
陶士涵=====男
陶士涵=====男
陶士涵=====nan
陶士涵=====nan
taoshihan=====nan
taoshihan=====nan
使用synchronized(){}同步代码块包裹操作同一个资源的地方
注意同步线程的个数,所有的线程都应该加上
注意是否是同一个锁,synchronized()括号内的锁参数:保证是个唯一的资源
使用synchronized(){}包裹上面的赋值和打印,锁:Resource对象(唯一的)
查看结果,此时没有安全问题
陶士涵=====男
陶士涵=====男
陶士涵=====男
taoshihan=====nan
taoshihan=====nan
taoshihan=====nan
死锁问题:同步中嵌套同步,并且锁不一致,此时会造成死锁问题
/**
* 资源
*
* @author taoshihan
*
*/
class Resource {
String name;
String sex;
} /**
* 输入
*
* @author taoshihan
*
*/
class Input implements Runnable {
private Resource resource; public Input(Resource resource) {
this.resource = resource;
} @Override
public void run() {
// 切换
boolean flag = true;
while (true) {
synchronized (resource) {
if (flag) {
resource.name = "taoshihan";
resource.sex = "nan";
} else {
resource.name = "陶士涵";
resource.sex = "男";
}
flag = !flag;
}
}
} } /**
* 输出
*
* @author taoshihan
*
*/
class Output implements Runnable {
private Resource resource; public Output(Resource resource) {
this.resource = resource;
} @Override
public void run() {
while (true) {
synchronized (resource) {
System.out.println(resource.name + "=====" + resource.sex);
}
}
} } public class InputOutputDemo { /**
* @param args
*/
public static void main(String[] args) {
Resource resource = new Resource();
Input input = new Input(resource);
Output output = new Output(resource); Thread t1 = new Thread(input);
Thread t2 = new Thread(output);
t1.start();
t2.start();
} }
[javaSE] 并发编程(线程间通信)的更多相关文章
- Java并发编程:线程间通信wait、notify
Java并发编程:线程间协作的两种方式:wait.notify.notifyAll和Condition 在前面我们将了很多关于同步的问题,然而在现实中,需要线程之间的协作.比如说最经典的生产者-消费者 ...
- java并发编程 线程间协作
线程间协作 1. 等待和通知 等待和通知的标准形式 等待方: 获取对象锁 循环中判断条件是否满足,不调用wait()方法 条件满足执行业务逻辑 通知方: 获取对象所 改变条件 通知所有等待在对象的线程 ...
- linux高级编程基础系列:线程间通信
linux高级编程基础系列:线程间通信 转载:原文地址http://blog.163.com/jimking_2010/blog/static/1716015352013102510748824/ 线 ...
- Java多线程编程(6)--线程间通信(下)
因为本文的内容大部分是以生产者/消费者模式来进行讲解和举例的,所以在开始学习本文介绍的几种线程间的通信方式之前,我们先来熟悉一下生产者/消费者模式. 在实际的软件开发过程中,经常会碰到如下场景 ...
- C++多线程编程(三)线程间通信
多线程编程之三——线程间通讯 作者:韩耀旭 原文地址:http://www.vckbase.com/document/viewdoc/?id=1707 七.线程间通讯 一般而言,应用程序中的一个次要线 ...
- Java并发——线程间通信与同步技术
传统的线程间通信与同步技术为Object上的wait().notify().notifyAll()等方法,Java在显示锁上增加了Condition对象,该对象也可以实现线程间通信与同步.本文会介绍有 ...
- 《java多线程编程核心技术》不使用等待通知机制 实现线程间通信的 疑问分析
不使用等待通知机制 实现线程间通信的 疑问分析 2018年04月03日 17:15:08 ayf 阅读数:33 编辑 <java多线程编程核心技术>一书第三章开头,有如下案例: ...
- Java多线程编程核心技术---线程间通信(二)
通过管道进行线程间通信:字节流 Java提供了各种各样的输入/输出流Stream可以很方便地对数据进行操作,其中管道流(pipeStream)是一种特殊的流,用于在不同线程间直接传送数据,一个线程发送 ...
- Java多线程编程核心技术---线程间通信(一)
线程是操作系统中独立的个体,但这些个体如果不经过特殊处理就不能成为一个整体.线程间的通信就是成为整体的必用方案之一.线程间通信可以使系统之间的交互性更强大,在大大提高CPU利用率的同时还会使程序员对各 ...
- Java并发——使用Condition线程间通信
线程间通信 线程之间除了同步互斥,还要考虑通信.在Java5之前我们的通信方式为:wait 和 notify.Condition的优势是支持多路等待,即可以定义多个Condition,每个condit ...
随机推荐
- Python 读取大文件的方式
对于读取容量小的文件,可以使用下面的方法: with open("path", "r") as f: f.read() 但是如果文件容量很大,高达几个G或者十几 ...
- jQuery基础笔记 事件(6)
day56 参考:https://www.cnblogs.com/liwenzhou/p/8178806.html#autoid-1-9-6 事件 ***** 1. 目前为止学过的绑定 ...
- html5 页面基本骨架
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http ...
- zookeeper集群环境搭建详细图文教程
zookeeper集群环境搭建详细图文教程 zhoubang @ 2018-01-02 [文档大纲] 友情介绍 软件环境 注意点 环境安装 1. 新建用于存储安装包以及软件安装的目录 2. 下载安装z ...
- day 52 Django 的中间件加载顺序
前情提要: django的中间键的作用是进行加载 可以通过中间键进行辅助操作 1.中间件的概念 中间件顾名思义,是介于request与response处理之间的一道处理过程,相对比较轻量级,并且在全局 ...
- Python Django 的学习资料
十分有用的链接: 链接1:http://www.cnblogs.com/wupeiqi/articles/5433893.html (银角大王) 链接2:https://www.cnblogs.c ...
- Windows下安装MySQL详细教程
Windows下安装MySQL详细教程 1.安装包下载 2.安装教程 (1)配置环境变量 (2)生成data文件 (3)安装MySQL (4)启动服务 (5)登录MySQL (6)查询用户密码 (7 ...
- 【xsy1154】 DNA配对 FFT
题目大意:给你一个字符串$s$和字符串$w$,字符集为${A,T,C,G}$,你要在字符串$s$中选出一个与$w$长度相同的子串,使得这两个串的差异度最小. 两个字符$c1$,$c2$的差异度为给定的 ...
- MySQL索引(六)
一.什么是索引 索引就像一本书的目录一样,如果在字段上建立索引,那么以索引为列的查询条件时可以加快查询的速度,这个就是MySQL优化的重要部分 二.创建主键索引 整个表的每一条记录的主键值在表内都是唯 ...
- Rsync备份服务
一.Rsync 原理图 二.Rsync 原理描述 2.1:什么是Rsync Rsync是备份的一款软件,它可以实现全量备份.增量备份,也可以在不改变内容.属性的情况下进行同步备份,端口默认是873 2 ...