LeetCode刷题之旅【多线程篇-4】中等: 1116. 打印零与奇偶数

2023-11-19

 

2019年11月22日

目录

题目:1116. 打印零与奇偶数

解题1:Semaphore 信号量作屏障

解题2:synchronized独占锁+线程阻塞与唤醒

拓展


题目:1116. 打印零与奇偶数

 

解题1:Semaphore 信号量作屏障

class ZeroEvenOdd {
    private int n;
    private static Semaphore z = new Semaphore(1);
	private static Semaphore e = new Semaphore(0);
	private static Semaphore o = new Semaphore(0);

	public ZeroEvenOdd(int n) {
		this.n = n;
	}

	// printNumber.accept(x) outputs "x", where x is an integer.
	public void zero(IntConsumer printNumber) throws InterruptedException {
		for (int i=1; i<=n; i++){
			z.acquire();
			printNumber.accept(0);
			if ((i&1)==0){
				e.release();
			} else {
				o.release();
			}
		}
	}

	/**
	 * 输出偶数
	 */
	public void even(IntConsumer printNumber) throws InterruptedException {
		for (int i=2; i<=n; i+=2){
			e.acquire();
			printNumber.accept(i);
			z.release();
		}
	}

	/**
	 * 输出奇数
	 */
	public void odd(IntConsumer printNumber) throws InterruptedException {
		for (int i=1; i<=n; i+=2){
			o.acquire();
			printNumber.accept(i);
			z.release();
		}
	}
}

解题2:synchronized独占锁+线程阻塞与唤醒

class ZeroEvenOdd {
    private int n;
    private boolean first;
    private boolean second;
    private boolean zoo = true;
    
    public ZeroEvenOdd(int n) {
        this.n = n;
    }

    // printNumber.accept(x) outputs "x", where x is an integer.
    public void zero(IntConsumer printNumber) throws InterruptedException {
        synchronized(this){
            for(int i=1;i<=n;i++){
                 while(!zoo){
                    this.wait();
                 }   
                printNumber.accept(0);
                zoo = false;
                if(i%2!=0){
                    first = true;
                }else{
                    second = true;
                }
                this.notifyAll();
            }
        }
    }

    public void even(IntConsumer printNumber) throws InterruptedException {
        synchronized(this){
            for(int i=2;i<=n;i+=2){
                while(!second){
                    this.wait();
                }
                printNumber.accept(i);
                second = false;
                zoo = true;
                this.notifyAll();
            }
        }

    }

    public void odd(IntConsumer printNumber) throws InterruptedException {
        synchronized(this){
            for(int i=1;i<=n;i+=2){
                
                while(!first){
                    this.wait();
                }
                printNumber.accept(i);
                first = false;
                zoo = true;
                this.notifyAll();
            }
        }

    }
}

 

拓展

  • 信号量的初始值有何讲究?0?1?-1?

If the value is positive, then it represents the number of threads that can decrement without blocking. If it is negative, then it represents the number of threads that have blocked and are waiting. If the value is zero, it means there are no threads waiting, but if a thread tries to decrement, it will block.

如果该值为正,则表示可以在不阻塞的情况下减少的线程数。

如果为负,则表示已阻塞且正在等待的线程数。

如果该值为零,则表示没有线程在等待,但如果线程尝试递减,则它将阻塞。

  • IntConsumer 是什么编程手法?

Consumer是java8提供的函数式接口之一,意思为消费者,接受参数而不返回值。

Consumer还有多个其他的接口,具体有以下几种,在使用函数式接口时,若有提供具体类型的接口,就尽量使用此接口,因为具体的类型指定可以避免装箱拆箱时所带来的额外资源消耗

参考:https://zhuanlan.zhihu.com/p/81626432


欢迎扫二维码关注公众号,获取技术干货

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

LeetCode刷题之旅【多线程篇-4】中等: 1116. 打印零与奇偶数 的相关文章

随机推荐

  • 过河卒 蓝桥杯 755

    题目描述 如图 A 点有一个过河卒 需要走到目标 B 点 卒行走规则 可以向下 或者向右 同时在棋盘上的 C 点有一个对方的马 该马所在的点和所有跳跃一步可达的点称为对方马的控制点 例如上图 C 点上的马可以控制 99 个点 图中的 P1
  • java实现rabbitmq消息队列

    1 rabbitmq常用的五种模型 基本消息模型 基本消息模型就是 一个生产者丶默认交换机丶一个队列丶一个消费者 work消息模型 work消息模型就是 一个生产者丶默认交换机丶一个队列丶多个消费者 fanout广播模式 发布 订阅模式 f
  • Powershell无法使用conda activate的问题

    主要引起的原因是Powershell使用Conda init失败 问题主要出现在中文系统中 特别与onedrive开启了 文档同步 有关 可以看到 最后两行生成了配置文件 用以启动conda 并在onedrive上 但是 onedrive中
  • 搭建prometheus+grafana监控系统

    prometheus简介 Prometheus是最初在SoundCloud上构建的开源系统监视和警报工具包 自2012年成立以来 许多公司和组织都采用了Prometheus 该项目拥有非常活跃的开发人员和用户社区 现在 它是一个独立的开源项
  • 计算机相关专业结业课题推荐及答辩技巧,加关喔!

    计算机相关专业结业课题推荐及答辩技巧 是不是还在为选题而烦恼 本文是提供一些计算机 软件 通信 电子等 相关专业大四选题推荐及一些答辩技巧 供给大家学习和参考 预祝各位看官学业进步 前程似锦 创作不易 帮忙点赞 收藏 好评哦 一 整个学年设
  • @JsonProperty注解解析

    1 概述 来源 JsonPrpperty是jackson包下的一个注解 详细路径 com fasterxml jackson annotation JsonProperty 作用 JsonProperty用在属性上 将属性名称序列化为另一个
  • 华为OD机试真题- 统计匹配的二元组个数【2023Q2】【JAVA、Python、C++】

    题目描述 给定两个数组A和B 若数组A的某个元素A i 与数组B中的某个元素B j 满足 A i B j 则寻找到一个值匹配的二元组 i j 请统计在这两个数组A和B中 一共存在多少个这样的二元组 输入描述 第一行输入数组A的长度M 第二行
  • 深度学习--Pytorch构建栈式自编码器实现以图搜图任务(以cifar10数据集为例)

    Pytorch构建栈式自编码器实现以图搜图任务 搞清楚pytorch与tensorflow区别 pytorch tensorflow 搞清楚栈式自编码器的内部原理 效果图 代码及效果图 欠完备编码器 卷积栈式编码器 栈式编码器 本文旨在使用
  • ssm项目tomcat正常启动,首页不能访问的问题分析

    遇到这种情况的我们可以从以下几方面进行问题的排查 1 首先出现这种问题一般都是springmvc xml不能正常读取 也就是说文件路径不正确 是否打了war包 lib包是否存在 web xml路径是否正确
  • 动态渲染 echarts 饼图(vue 2 + axios + Springboot)

    目录 前言 1 项目搭建 1 1 前端 1 2 后端 2 后端数据渲染前端 2 1 补充1 在 vue 中使用 axios 2 2 补充2 Springboot 处理跨域问题 2 3 修改前端代码 2 3 1 修改饼图样式 2 3 2 调用
  • Fast-ReID 训练自己的数据集调优记录(一)

    Fast ReID前期准备 文章目录 Fast ReID前期准备 前言 一 Fast ReID 介绍 Fast ReID 特点 FastReID 架构 二 Fast ReID 复现 前言 FastReID 是一个 SOTA 级的 ReID
  • Linux开放普通用户使用winscp上传文件和禁止root用户登录

    鉴于使用root用户操作系统有诸多风险 也给网络黑客暴力破解服务器密码可乘之机 于是决定禁用root用户远程登录系统 可是禁用root用户登录系统也带来一个问题 那就是root用户登录不了WinScp 也就没办法上传文件了 这还了得 这会给
  • qt中加载qss样式不生效的问题

    前提是你能正确加载 而且 你试着将你的qss后缀改成css 发现能生效 但是后缀改成qss没有生效 这个原因就是字符编码的问题了 需要改成utf 8才行 使用notepade 来改是一种方式 参考博客 QT 避坑指南 QSS文件引入及解决自
  • Allegro使用总结-查看Layout基本操作:

    好久没用CSDN写过笔记了 没想到无意间打开 编辑器更新啦 以前巨难用的 富文本编辑器 终于改观了 变的好像语雀 1 视图 画面操作 a 画面缩放 Zoom F11 F12 或 鼠标滚轮 补充 Zoom分辨率调节 Setup user pr
  • Unity2019_寻路系统

    简单导航寻路功能 选定为静态网格导航 Windows gt Ai gt Navigation 点击烘焙 角色上挂一个导航网格组件 挂上脚本 鼠标点击位置设置为导航的终点 using UnityEngine using UnityEngine
  • admin-lte+ng-bootstrap组合开发之modal弹层不显示

    在用admin lte做前端页面框架做开发 需要用到弹出层效果时 看到ng bootstrap中有Modal实现弹层效果 步骤如下 1 安装和配置ng bootstrap 具体见 https www jianshu com p 690080
  • Qt

    Qt UDP广播通信的使用 实战项目使用案例 1 UDP广播介绍 UDP广播地址固定IP地址为 XXX XXX XXX 255 如果向全网段发送广播消息 那么广播地址为 255 255 255 255 如果向单个网段发送广播消息 例如你的I
  • Java中方法的重载和重写

    重载是在同一个类中的具有相同方法名 不同参数 个数 类型 顺序 的方法的定义 构造方法 普通方法 抽象方法都可以重载 重写是在子类继承父类的时候重写 在子类重写的方法名必须和父类的方法名完全相同 可以用 Override检查是否是重写方法
  • 白盒测试和静态测试

    白盒测试技术是根据被测对象的结构 系统化设计测试用例的一种方法 又称透明盒测试 或结构测试 测试覆盖准则之白盒测试设计技术的核心代码覆盖标准 1 语句覆盖 2 判定覆盖 3 条件覆盖 4 判定条件覆盖 5 条件组合覆盖 6 路径覆盖 白盒测
  • LeetCode刷题之旅【多线程篇-4】中等: 1116. 打印零与奇偶数

    2019年11月22日 目录 题目 1116 打印零与奇偶数 解题1 Semaphore 信号量作屏障 解题2 synchronized独占锁 线程阻塞与唤醒 拓展 题目 1116 打印零与奇偶数 解题1 Semaphore 信号量作屏障