星空网 > 软件开发 > Java

[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

*特别声明:以上内容来自于网络收集,著作权属原作者所有,如有侵权,请联系我们: admin#shaoqun.com (#换成@)。

tiktok 第三方数据:https://www.goluckyvip.com/tag/83354.html
tiktok 教学:https://www.goluckyvip.com/tag/83355.html
tiktok 国际版美女:https://www.goluckyvip.com/tag/83356.html
tiktok 海外用户:https://www.goluckyvip.com/tag/83358.html
tiktok下载搜索:https://www.goluckyvip.com/tag/83359.html
tiktok 美国有小店吗:https://www.goluckyvip.com/tag/83360.html
深圳到西安自驾路线攻略 深圳到西安自驾最佳路线:https://www.vstour.cn/a/411228.html
松花蛋是哪里的特产松花蛋的产地:https://www.vstour.cn/a/411229.html
相关文章
我的浏览记录
最新相关资讯
海外公司注册 | 跨境电商服务平台 | 深圳旅行社 | 东南亚物流