面试锦集:手写一个同步类容器之wait/notify/notifyAll实现

面试必背:多线程模块大厂面试题收录 即:Conditon中的await()对应Object的wait(),Condition中的signal()对应Object的notify(),Condition中的signalAll()对应Object的notifyAll()。并且因为当前线程可能会等待多个线程的锁,如果通过线程来操作,就非常复杂了。LongAdder是根据锁分段来实现的,它里面维护一组按需分配的计数单元,并发计数时,不同的线程可以在不同的计数单元上进行计数,这样减少了线程竞争,提高了并发效率。 阅读详情

互联网大厂面试必考题目:

手写一个同步类容器,支持多个生产者线程以及多个消费者线程的阻塞调用。采用 wait notify/notifyAll实现。我第一次去大厂面试都被难住了!!!

package com.container;

import java.util.LinkedList;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * 面试锦集:手写一个同步类容器(互联网大厂面试题目)
 * 
 * 支持多个生产者线程以及多个消费者线程的阻塞调用,采用 wait notify/notifyAll实现
 * 
 * @author 小辉GE/小辉哥
 * 
 * 2019年8月8日 下午20:19:00
 */
public class ContainerSynchronized {
	// 最少0个元素
	private final int MIN_SIZE = 0;
	// 最多20个元素
	private final int MAX_SIZE = 20;
	// 定义容器size的计算器
	private final AtomicInteger atomic = new AtomicInteger(0);
	// 定义装载容器
	private final LinkedList<Object> container = new LinkedList<Object>();

	// effective java(高效JAVA)
	public synchronized void put(Object obj) {
		while (atomic.get() == MAX_SIZE) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		// 添加元素
		container.add(obj);
		// 计数器
		atomic.incrementAndGet();
		// 通知所有消费者线程进行消费
		this.notifyAll();
	}

	public synchronized Object get() {
		Object result = null;
		while (atomic.get() == MIN_SIZE) {
			try {
				this.wait();
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
		}
		result = container.removeFirst();
		atomic.decrementAndGet();
		// 通知所有生产者线程进行生产
		this.notifyAll();
		return result;
	}

	public static void main(String[] args) {
		ContainerSynchronized sync = new ContainerSynchronized();
		// 启动消费者线程
		for (int i = 0; i < 10; i++) {
			new Thread(() -> {
				for (int j = 0; j < 10; j++) {
					System.out.println("消费者" + Thread.currentThread().getName() + ",获取数据为:" + sync.get());
				}
			}, "consumer" + i).start();
		}

		try {
			TimeUnit.SECONDS.sleep(1);
		} catch (InterruptedException e) {
			e.printStackTrace();
		}

		// 启动生产者线程
		for (int i = 0; i < 5; i++) {
			new Thread(() -> {
				for (int j = 0; j < 20; j++) {
					int data = (int) (Math.random() * 1000);
					sync.put(data);
					System.out.println("生产者" + Thread.currentThread().getName() + ",存放数据为:" + data);
				}
			}, "producer" + i).start();
		}
	}
}

测试输出结果如下(输出结果比较多,我们只截取部分):

从结果可以看出生产者和消费者线程是交替输出的。关于wait notify/notifyAll实现方式还不明白的同学,详情可以在我的头条号‘小辉GE’查看对应‘手写一个同步类容器(互联网大厂面试题目)’视频,里面有详细讲解。

以上代码仅供参考,如有不当之处,欢迎指出!!!

更多干货,欢迎大家关注和联系我。期待和大家一起更好的交流、探讨技术!!!

 

手把手教你用DevExpress Patch工具解决VS项目中的试用弹窗问题 本文详细指导开发者使用DevExpress Patch工具解决Visual Studio项目中恼人的试用弹窗问题。核心在于理解并分步处理:首先正确应用补丁工具以绕过运行时验证,然后重点清理或重置项目中的licenses.licx文件以消除编译时验证,从而彻底根治弹窗。 阅读详情

相关推荐

AI开发助手介绍

AI开发助手介绍随着NLP方向发展越来越成熟,AI写代码领域出现了几个非常好的模型,今天笔者给大家推荐几个AI Coding 助手AI Coding助手是以IDEA插件或vim插件形式提供服务,在编辑器中写代码时,可以实时预测下一行要输入的代码,提升开发效率。Github Copilot首先要介绍的是Github Copilot,Copilot是个AI Coding助手,它从注释和代码中提取上下文,给出单行和整个函数的代码建议,Copilot由Open AI 的CodeX模型提供支持,它是一个由OpenAI

bobo_simpler的博客 5765

面试锦集:手写一个同步类容器之BlockingQueue实现

互联网大厂面试必考题目: 手写一个同步类容器,支持多个生产者线程以及多个消费者线程的阻塞调用。采用BlockingQueue实现,我第一次去大厂面试都被难住了!!! package com.container; import java.util.concurrent.BlockingQueue; import java.util.concurrent.LinkedBlockingQueue...

饶艳辉 684

CosyVoice 本地部署详细教程 手把手小白教程

本文提供了详细的CosyVoice本地部署教程,强调了避免中文名称和空格的重要性,并列出了必要的软件安装步骤,包括CUDA、cuDNN、Git和Miniconda。教程涵盖了从检查CUDA版本到下载模型和运行模型的全过程,确保用户能够顺利部署并使用CosyVoice。

huazn612的博客 2万+

生产者消费者两种实现:wait/notifyAll和Lock/Condition

1.wait/notifyAll /** * 面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, * 能够支持2个生产者线程以及10个消费者线程的阻塞调用 * * 使用wait和notify/notifyAll来实现 * * @author cx */ package com.chanx.demo.example.c_021;...

weixin_34062469的博客 173

半导体设备上位机开发:我的经验与新人指导

半导体设备上位机开发是一项复杂而富有挑战性的工作,需要扎实的技术基础和丰富的经验。如果你对半导体设备上位机开发感兴趣,欢迎随时与我交流,我会尽力帮助你!

qq_43518667的博客 2726

ROS从入门到精通0-1:教程导读

ROS概念太多太复杂?ROS从入门到精通系列订阅必看

FRIGIDWINTER的博客 1万+

JAVA - 多线程 - Object.wait / notify / notifyAll & LockSupport.park / unpark

先来看一道淘宝面试题 实现一个容器, 提供两个方法add() , size(), 需要写两个线程 线程1: 添加10个元素到容器中, 得全部执行完 线程2: 实现监控元素的个数, 当个数到5个时, 打印"监控结束" , 线程2结束 普通人的错误解法 ( 主要用于深入表明题意 ) public class T01_WithoutVolatile { private List lists = new LinkedList(); public void add(Object o) {

weixin_42254177的博客 259

2026年佰维存储数字IC笔试试卷带答案

建立时间是有效时钟沿到来前,输入数据必须稳定保持的最短时间。保持时间是有效时钟沿到来后,输入数据必须继续稳定保持的最短时间。

Open 103

c++ 优先队列_「面试」Java进阶 用wait和notify实现一个阻塞队列

以下内容均由本人独立完成,希望你看完之后能有更多更深入的了解,欢迎关注➕如下图就是一个简单都阻塞队列都模型,线程1往里面塞数据,线程2从中取数据,接下来就利用Java中最基础的wait和notify实现一个阻塞队列。本图来自:http://tutorials.jenkov.com/java-concurrency/blocking-queues.htmlwait和notify以及notifyAll...

weixin_39791152的博客 229

CelebA-HQ数据集下载【详细明了版】分辨率包括【64,128,256,512,1024】

CelebA-HQ 是在ICLR2018上,nVidia发表了一篇名为Progressive Growing of GANs for Improved Quality, Stability, and Variation的论文,文中通过训练高分辨率GAN生成了一个新的人脸数据集CelebA-HQ.CelebA是港科大汤晓鸥组收集的人脸数据集(总共200k图片),包括了人脸特征点(landmark),人脸属性(attribute)等信息,详细介绍参考链接[1]和[2]

zik的博客 1万+

《QGIS快速入门与应用基础》108:CGCS2000对应的投影坐标系

本文详细解析了CGCS2000地理坐标系对应的各类投影坐标系,包括高斯-克吕格3°带/6°带、UTM、地方独立投影和Web墨卡托投影。文章系统阐述了各投影类型的分带规则、参数设置、精度特性及适用场景,并提供了EPSG编码对照表和QGIS操作指南。通过"基准+投影"的绑定机制,这些投影坐标系实现了平面坐标与经纬度的精准转换,满足从大比例尺工程测量到Web地图服务等不同应用需求。内容涵盖投影原理、坐标格式、变形控制等关键技术要点,为GIS开发者和测绘人员提供了实用的参考信息。

LuckyHanMo的博客 540

2024年java线程的生命周期及wait(),notify(),notifyAll()的详解分析,想拿高工资

很多人感叹“学习无用”,实际上之所以产生无用论,是因为自己想要的与自己所学的匹配不上,这也就意味着自己学得远远不够。无论是学习还是工作,都应该有主动性,所以如果拥有大厂梦,那么就要自己努力去实现它。最后祝愿各位身体健康,顺利拿到心仪的offer!

2301_82257317的博客 867

VisionPro 机器视觉案例 之 彩色保险丝个数统计

CogColorSegmenterTool CogColorMatchTool

机器视觉李小白的博客 2352

2024年最新Java线程基础进阶,2024Java高级面试题及答案

学完之后,若是想验收效果如何,其实最好的方法就是可自己去总结一下。比如我就会在学习完一个东西之后自己去手绘一份xmind文件的知识梳理大纲脑图,这样也可方便后续的复习,且都是自己的理解,相信随便瞟几眼就能迅速过完整个知识,脑补回来。下方即为我手绘的MyBtis知识脑图,由于是xmind文件,不好上传,所以小编将其以图片形式导出来传在此处,细节方面不是特别清晰。但可给感兴趣的朋友提供完整的MyBtis知识脑图原件(包括上方的面试解析xmind文档)

2401_84585155的博客 679

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

生产者和消费者-高并发(面试题)

面试题:写一个固定容量同步容器,拥有put和get方法,以及getCount方法, 能够支持,2个生产者线程及10个消费者线程的阻塞调用(经常问!) 使用synchronized、wait和notify/notifyall来实现 ...

weixin_42845574的博客 518

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Java多线程面试问题

Java多线程与并发面试题精讲摘要 本文全面解析Java多线程与并发编程核心知识点,涵盖线程基础(创建、生命周期、优先级)、同步机制(synchronized、Lock、volatile)、线程通信(wait/notify)、线程安全策略及并发工具类(线程池、阻塞队列、Callable/Future)。重点问题包括: 线程同步:同步块优于同步方法,避免不必要的锁竞争; 线程安全:通过原子类、ThreadLocal、不可变类等实现; 死锁:分析线程转储(ThreadDump)及避免嵌套锁; 并发工具:Exec

ywl470812087的博客 11万+

「大厂」Java高级架构师面试高频题:算法+spring+Mysql+微服务等

分布式技术专题+面试解析+相关的手写和学习的笔记pdf《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!” />分布式技术专题+面试解析+相关的手写和学习的笔记pdf还有更多Java笔记分享如下:[外链图片转存中…(img-OX7qEC1i-1712247961823)]《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》点击传送门即可获取!

2401_84046545的博客 1044

Java并发编程:notifyAll方法详解

在当今的软件开发领域,高并发已经成为一个不可忽视的关键问题。尤其是在处理大量用户请求或进行资源密集型操作时,如何有效地管理线程间的同步与通信变得尤为重要。以一个典型的场景为例,假设我们正在开发一个在线购物平台,当用户下单时,系统需要处理订单、库存更新以及支付等多个环节。在这个过程中,如果多个线程同时访问共享资源,如数据库或缓存,就很容易引发并发问题,导致数据不一致或系统崩溃。因此,掌握Java高并发编程的相关知识点,尤其是notifyAll方法,对于确保系统稳定性和性能至关重要。

我是Java程序员廖志伟,感谢朋友们的支持! 751

并发编程demo记录demo21 MyContainer(固定容量同步容器)系列

面试题:写一个固定容量同步容器(满了之后,put方法要等着,空了之后,get方法要等着),拥有put和get方法,以及getCount方法, 能够支持2个生产者线程以及10个消费者线程的阻塞调用 way1 使用wait和notify/notifyAll来实现 import java.util.LinkedList; import java.util.concurrent.TimeUnit; pu...

zero 245

面试题:生产者消费者模型

题目:写一个固定容量的同步容器,拥有put和get方法,一个getCount方法,能够支持2个生产者线程以及10个消费者现成的阻塞调用。 使用wait和notify/notifyAll来实现 import java.util.LinkedList; public class MyContainer<T> { final private LinkedList<T&g...

weixin_40027906的博客 538

206面试题(28~46)

206道Java面试题(28~46) 28.Array和ArrayList有什么区别? 一、基本性质 Array(数组) Array是一种固定大小的数据结构。 用于存储多个相同类型的元素。 创建时需要指定数组的大小,且长度定义完后不能改变。 ArrayList(动态数组) ArrayList是Java Collections框架的一部分。 长度可变的集合类。 可以根据需要自动改变其大小。 二、存储内容 Array 基本数据类型和对象类型。 但是一个数组就只能存储一

2301_80112070的博客 805

java 协作关系_java线程间的协作

本次内容主要讲等待/通知机制以及用等待/通知机制手写一个数据库连接池。1、为什么线程之间需要协作线程之间相互配合,完成某项工作,比如:一个线程修改了一个对象的值,而另一个线程感知到了变化,然后进行相应的操作,整个过程开始于一个线程,而最终执行又是另一个线程。前者是生产者,后者就是消费者,这种模式隔离了“做什么”(What)和“怎么做”(How)。简单的办法是让消费者线程不断地循环检查变量是否符合预...

weixin_33831535的博客 97
上一篇: 深入浅出设计模式:单例模式之静态内部类
下一篇: 面试锦集:手写一个同步类容器之Lock/Condition await signalAll实现
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值