[javaSE] 并发编程(线程间通信)

前端之家收集整理的这篇文章主要介绍了[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(); } }

 

猜你在找的Java SE相关文章