• [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();
        }
    
    }
  • 相关阅读:
    解决Django在mariadb创建的表插入中文乱码的问题
    运行在CentOS7.5上的Django项目时间不正确问题
    获取百度网盘真实下载连接
    Django2.x版本在生成数据库表初始化文件报错
    Pycharm中的Django项目连接mysql数据库
    Django2.x版本路由系统的正则写法以及视图函数的返回问题
    CentOS7.5安装坚果云
    CentOS7.5安装下载工具
    CentOS6.5修改/etc/pam.d/sshd后root无法ssh登陆
    oracle 时间
  • 原文地址:https://www.cnblogs.com/taoshihan/p/5475566.html
Copyright © 2020-2023  润新知