前端之家收集整理的这篇文章主要介绍了
[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
死锁问题:同步中嵌套同步,并且锁不一致,此时会造成死锁问题
@H_
301_263@
/**
* 资源
*
* @author taoshihan
*
*/
class Resource {
String name;
String sex;
}
* 输入
*
* class Input
implements Runnable {
private Resource resource;
public Input(Resource resource) {
this.resource =
resource;
}
@Override
public void run() {
// 切换
boolean flag =
true;
while (
) {
synchronized (resource) {
if (flag) {
resource.name = "taoshihan"
;
resource.sex = "nan"
;
} else {
resource.name = "陶士涵"
;
resource.sex = "男"
;
}
flag = !
flag;
}
}
}
}
* 输出
*
* class Output
Output(Resource resource) {
(resource) {
System.out.println(resource.name + "=====" +
resource.sex);
}
}
}
}
InputOutputDemo {
* @param args
*/
static main(String[] args) {
Resource resource =
new Resource();
Input input =
Input(resource);
Output output =
Output(resource);
Thread t1 =
Thread(input);
Thread t2 =
Thread(output);
t1.start();
t2.start();
}
}