前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >[javaSE] 并发编程(线程间通信)

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

作者头像
唯一Chat
发布2019-09-10 15:37:00
2930
发布2019-09-10 15:37:00
举报
文章被收录于专栏:陶士涵的菜地陶士涵的菜地

新建一个资源类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();
    }

}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-05-09 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档