线程间通信:生产者消费者(都要加锁,且为同一把锁)
2016-05-05 19:06
176 查看
多个线程都要加锁,并且加的是同一把锁
public
classStudent {
Stringname;
int
age;
}
public
classSetThread implementsRunnable {
private Student
s;
private
int x = 0;
public SetThread(Student s) {
this.s = s;
}
@Override
public
void run() {
while (true) {
synchronized (s) {
if (x % 2 == 0) {
s.name =
"林青霞";//刚走到这里,就被别人抢到了执行权
s.age = 27;
}else{
s.name =
"刘意";
//刚走到这里,就被别人抢到了执行权
s.age = 30;
}
x++;
}
}
}
}
public
classGetThread implementsRunnable {
private Student
s;
public GetThread(Student s) {
this.s = s;
}
@Override
public
void run() {
while (true) {
synchronized (s) {
System.out.println(s.name +
"---" + s.age);
}
}
}
}
/*
* 分析:
* 资源类:Student
* 设置学生数据:SetThread(生产者)
* 获取学生数据:GetThread(消费者)
* 测试类:StudentDemo
*
* 问题1:按照思路写代码,发现数据每次都是:null---0
* 原因:我们在每个线程中都创建了新的资源,而我们要求的时候设置和获取线程的资源应该是同一个
* 如何实现呢?
* 在外界把这个数据创建出来,通过构造方法传递给其他的类。
*
* 问题2:为了数据的效果好一些,我加入了循环和判断,给出不同的值,这个时候产生了新的问题
* A:同一个数据出现多次
* B:姓名和年龄不匹配
* 原因:
* A:同一个数据出现多次
* CPU的一点点时间片的执行权,就足够你执行很多次。
* B:姓名和年龄不匹配
* 线程运行的随机性
* 线程安全问题:
* A:是否是多线程环境
是
* B:是否有共享数据
是
* C:是否有多条语句操作共享数据
是
* 解决方案:
* 加锁。
* 注意:
* A:不同种类的线程都要加锁。
* B:不同种类的线程加的锁必须是同一把。
*/
public
classStudentDemo {
public
static void main(String[] args) {
//创建资源
Students = newStudent();
//设置和获取的类
SetThreadst = newSetThread(s);
GetThreadgt = newGetThread(s);
//线程类
Threadt1 = newThread(st);
Threadt2 = newThread(gt);
//启动线程
t1.start();
t2.start();
}
}
public
classStudent {
Stringname;
int
age;
}
public
classSetThread implementsRunnable {
private Student
s;
private
int x = 0;
public SetThread(Student s) {
this.s = s;
}
@Override
public
void run() {
while (true) {
synchronized (s) {
if (x % 2 == 0) {
s.name =
"林青霞";//刚走到这里,就被别人抢到了执行权
s.age = 27;
}else{
s.name =
"刘意";
//刚走到这里,就被别人抢到了执行权
s.age = 30;
}
x++;
}
}
}
}
public
classGetThread implementsRunnable {
private Student
s;
public GetThread(Student s) {
this.s = s;
}
@Override
public
void run() {
while (true) {
synchronized (s) {
System.out.println(s.name +
"---" + s.age);
}
}
}
}
/*
* 分析:
* 资源类:Student
* 设置学生数据:SetThread(生产者)
* 获取学生数据:GetThread(消费者)
* 测试类:StudentDemo
*
* 问题1:按照思路写代码,发现数据每次都是:null---0
* 原因:我们在每个线程中都创建了新的资源,而我们要求的时候设置和获取线程的资源应该是同一个
* 如何实现呢?
* 在外界把这个数据创建出来,通过构造方法传递给其他的类。
*
* 问题2:为了数据的效果好一些,我加入了循环和判断,给出不同的值,这个时候产生了新的问题
* A:同一个数据出现多次
* B:姓名和年龄不匹配
* 原因:
* A:同一个数据出现多次
* CPU的一点点时间片的执行权,就足够你执行很多次。
* B:姓名和年龄不匹配
* 线程运行的随机性
* 线程安全问题:
* A:是否是多线程环境
是
* B:是否有共享数据
是
* C:是否有多条语句操作共享数据
是
* 解决方案:
* 加锁。
* 注意:
* A:不同种类的线程都要加锁。
* B:不同种类的线程加的锁必须是同一把。
*/
public
classStudentDemo {
public
static void main(String[] args) {
//创建资源
Students = newStudent();
//设置和获取的类
SetThreadst = newSetThread(s);
GetThreadgt = newGetThread(s);
//线程类
Threadt1 = newThread(st);
Threadt2 = newThread(gt);
//启动线程
t1.start();
t2.start();
}
}
相关文章推荐
- HDU 1491 Octorber 21st (日期计算)
- htmlentities 函数结构与htmlspecialchars 函数类似
- 第十一周实践项目5————摩托车继承自行车和机动车
- MySQL主从数据库同步延迟问题解决
- HTML5 audio标签使用 preload属性 规定是否在页面加载后载入音频
- php第十节课
- Storm处理流程, 基本参数配置
- Android 开发四大基本组件之一——Activity详解
- 线程安全与可重入函数
- PHP & HTML5 学习 第四课 PHP变量
- HTML加入CSS
- CentOS 7在grub rescue模式中修复系统
- 对各组意见的反馈(第一阶段)
- 导航栏上面添加UISearchBar pop回去的时候会把添加的导航栏带回去的问题
- Strom Topology执行分析:worker数,Bolt实例数,executor数,task数
- C++获取系统当前时间(精确到微秒)
- 第十周项目三 存储班长信息的学生类(1) (改法 2 )
- Centos 5 Oracle 11G 超详细安装
- js框架相关文章收藏
- 3Sum