你的位置:首页 > Java教程

[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();  }}