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

Java基础学习之并发篇:手写阻塞队列ArrayBlockingQueue 学习目标 我们都知道在并发编程中,阻塞队列在多线程中的场景特别有用,比如在生产和消费者模型中,生产者生产数据到队列,队列满时需要阻塞线程,停止生产。消费者消费队列,对队列为空时阻塞线程停止消费,在Java中有提供不同场景的阻塞队列,那么接下来我们将学习 ReentrantLock的Condition原理 BlockingQueue的定义 了解ArrayBlockingQueue的实现 如何手写一个阻塞队列 Condition原理 在学习阻塞队列之前,我们先需要弄清楚ReentrantLock的Cond 阅读详情

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

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

package com.container;

import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.TimeUnit;

/**
 * 并发编程下基于BlockingQueue实现一个线程安全的同步类容器(互联网大厂面试题目)
 *
 * @author 小辉GE/小辉哥
 * <p>
 * 2019年8月13日 下午20:30:00
 */
public class ContainerBlockingQueue {
    BlockingQueue<Object> queue = new LinkedBlockingQueue<>(5);

    public void put(Object obj) {
        // 如果队列是满的话,会阻塞当前线程
        try {
            queue.put(obj);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    public Object take() {
        Object result = null;
        try {
            // 如果队列为空,会阻塞当前线程
            result = queue.take();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        return result;
    }

    public static void main(String[] args) {
        ContainerBlockingQueue blockQueue = new ContainerBlockingQueue();
        // 启动消费者线程
        for (int i = 0; i < 10; i++) {
            new Thread(() -> {
                for (int j = 0; j < 10; j++) {
                    System.out.println("消费者" + Thread.currentThread().getName() + ",获取数据为:" + blockQueue.take());
                }
            }, "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);
                    blockQueue.put(data);
                    System.out.println("生产者" + Thread.currentThread().getName() + ",存放数据为:" + data);
                }
            }, "producer" + i).start();
        }
    }
}

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

从结果可以看出生产者和消费者线程是交替输出的,我们可以分析出采用BlockingQueue(线程安全的、有界的、阻塞)队列的优点:

  1. 1、BlockingQueue来实现线程安全的同步类容器,不用考虑put、take方法加锁
  2. 2、BlockingQueue来实现线程安全的同步类容器,不用考虑容器size到临界值需要wait notify/notifyAll

关于BlockingQueue实现方式还不明白的同学,详情可以在我的头条号‘小辉GE’查看对应‘并发编程下基于BlockingQueue实现同步类容器(互联网大厂面试题)’视频,里面有详细讲解。

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

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

 

面试官:你手写过堵塞队列吗? 面试官:你好,你先做个自我介绍吧 某人:面试官你好,我叫真俊巴 面试官微微一笑:看你简历,你精通多线程?那你手写过堵塞队列吗? 某人心里出现一万个问号,堵塞队列是啥玩意?平时基本都是crud,顶多用多线程跑数据 ... 阅读详情

相关推荐

【JAVA】45. 并发容器:CopyOnWriteArrayList与BlockingQueue

是 Java 并发包中的一个线程安全的列表实现。它采用了写时复制(Copy-On-Write)的策略,当对列表进行写操作(如addsetremove等)时,会先复制一份当前列表的副本,然后在副本上进行修改,最后将修改后的副本替换原来的列表。这种方式保证了在进行写操作时,不会影响其他线程的读操作,从而实现了读写分离。是一个接口,它继承自Queue接口,提供了阻塞操作的功能。当队列满时,插入操作会阻塞;当队列空时,移除操作会阻塞。常用于生产者 - 消费者模型中,协调生产者和消费者的速度。

Vinfol的博客 1012

手写实现阻塞队列

如何在不使用JDK的BlockingQueue的情况下,手写实现阻塞队列的功能,可以使用ArrayList或者LinkedList。

yzpbright的博客 1757

【Java并发容器全景解析】从BlockingQueue到Disruptor的高性能队列实战

订单系统内存占用达32GB后被Kill。

资深全栈架构师,乐于在 优快云 分享技术见解,与大家携手共进,共攀技术巅峰! 1288

【并发专题】手写LinkedBlockingQueue

下面只是简单的实现了。

qq_32681589的博客 341

JAVA多线程与高并发(六)[常用容器CopyOnWriteList,ConurrentHashMap,各种BlockingQueue,PriorityQueue,TransferQueue]

link-JAVA多线程与高并发系列[前言,大纲,目录] 容器是面试的重灾区,因为它涉及到很多方面,比如数据结构,算法,高并发. 现在先从使用的角度了解一下,为了学习线程池做准备.具体的容器底层,比如HashMap和SkipList等学习数据结构的时候再记录. 从物理存储角度看,只有两种数据结构: 1.数组,连续存储 2.链表,不连续存储 从逻辑上看,有很多种数据结构了… 常见容器 Collect...

书院二层楼 466

手写一个线程安全的非阻塞队列,并且实现入队出队方法

实现思路:利用单向链表来保存队列的数据,在往队列中添加元素的时候,新建一个节点,加入到队尾,加入到队尾的操作,利用CAS原理加乐观锁,另外,还需要将新加的节点设置为新的队尾,此步操作也需要利用CAS,head与tail变量用volatile修饰,保证多线程环境下的线程可见性。 相关代码如下: import sun.misc.Unsafe; import java.lang.reflect.Field; public class MyLinkQueue { //头节点 private volatile Node head; //尾节点 private volati

手写阻塞队列之简易版LinkedBlockingQueue

【代码】手写阻塞队列之简易版LinkedBlockingQueue。

vs782的博客 181

IAR调试CC1310的错误:Fatal error:Failed to connect to the XDS emlulator (Error -241 @ 0x0:)

从simplelink_cc13x0_sdk_2_10_00_36导入collector工程后,rebuild后进行debug,出现了如图错误:Fatal error:Failed to connect to the XDS emlulator (connect ICEPick)...(Error -241 @ 0x0)A router subpath could not be accessed....

qq_40417648的博客 6228

手写LinkedBlockingQueue

原作者:老铁123    出处:https://blog.youkuaiyun.com/qewgd/article/details/88363745  本文归作者【老铁123】和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。 LinkedBlockingQueue基于链表的阻塞队列,生产者消费者模型应用。 import java.util....

qewgd的博客 407

Maya ACES工作流程配置(Arnold 及 RedShift 贴图配置规范-还原出SP-Aces流程下贴图正确的效果) PS还原Aces流程下渲染的图

*如果使用SP,项目工程如果新建的时候设置的就是Aces的流程的话,按规范正常导出即可,贴图会带上相对应的后缀,然后贴图导入材质球的时候会根据后缀自动设置相对应的色彩空间;**万一不是,就自己手动设置一下对应的色彩空间即可;然后点击选择当前的或者选择全部导入的贴图,点击右下角后,开始转换;我复制了一下,一个默认没有LUT的效果,然后另外一个是加载2个LUT后的还原效果,和渲染的效果应该是没有区别的,至少我没有看出明显的区别;把需要转换的贴图拖拽到左侧,然后右面选择需要转换到的相对应的色彩空间;...

Yuulily 7993

用pyqtgraph 和pyqt5绘制股票K线图

# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'QWidget_plot.ui' # # Created by: PyQt4 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost!...

qq_23114283的博客 5427

Java面试-Java 并发容器总结:ConcurrentHashMap、CopyOnWriteArrayList、BlockingQueue

Java并发容器三巨头解析 本文系统讲解Java三大并发容器: ConcurrentHashMap:JDK7采用分段锁,JDK8升级为CAS+synchronized实现更高并发 CopyOnWriteArrayList:写时复制技术实现读无锁/写加锁,适合读多写少场景 BlockingQueue:提供阻塞机制实现生产者-消费者模式 通过电商秒杀案例演示实际应用,对比传统同步容器的性能优势,并给出面试常见问题解析。掌握这些"并发武器"能有效提升系统吞吐量,应对高并发挑战。 (字数:149

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

SWIFT报文实战指南:从MT700到MT799的信用证操作全解析

本文深入解析了国际贸易中信用证操作的核心SWIFT报文流程,从开证的MT700到各类通知、修改及结算报文(如MT707、MT730、MT754、MT732/734等)。通过实战案例与关键字段拆解,指导外贸与银行从业者精准处理报文,规避风险,并探讨了利用自动化工具提升处理效率的方法,助力保障跨境交易顺畅。

weixin_29015801的博客 878

深入解析 BlockingQueue:并发编程面试中的高频考点!

在 Java 多线程面试中,包是出题重地,其中的被广泛用于生产者-消费者模型。它的线程安全、阻塞机制、队列实现方式(数组或链表)都是面试官重点关注的维度。掌握 BlockingQueue,不仅是熟悉接口这么简单,更关键的是理解其阻塞原理、实际应用场景,以及如何避免死锁或性能瓶颈等问题。BlockingQueue 是并发编程中的重要组件,不仅仅是工具类,更是多线程协作的一种设计范式。掌握基本原理与常用实现类区别;练习经典生产者-消费者模型,并理解其中的阻塞机制;关注实际应用中的坑点。

残影的博客 1154

实战全解|大疆司空2二次开发:从接口开发到第三方业务系统深度融合

大疆司空2二次开发是实现行业无人机定制化应用的关键,通过OpenAPI后端对接+前端组件集成的组合方式,可快速完成功能定制,而与第三方业务系统的深度融合,能彻底打通“业务下发-设备执行-数据回传-流程闭环”的全链路,让无人机管控真正融入行业业务流程。开发过程中,建议优先采用私有版部署保障数据安全,通过中间适配层降低系统耦合度,结合实际业务场景打磨功能,避免过度开发。随着大疆开发者生态的完善,司空2的二次开发能力将持续升级,为更多行业无人机应用提供技术支撑。

2501_93651177的博客 964

innovus:ccopt_design流程

我正在「拾陆楼」和朋友们讨论有趣的话题,你⼀起来吧?spec文件可以只创建一次,无需多次创建。2)virtual balance阶段。3)Full Balancing阶段。4)Clock Routing阶段。1)clustering阶段。

m0_61544122的博客 2475

面试官:谈谈BlockingQueue

大家好,我是小黑,一个在互联网苟且偷生的农民工。 队列 学过数据结构的同学应该都知道,队列是数据结构中一种特殊的线性表结构,和平时使用的List,Set这些数据结构相比有点特殊,它的特殊之处在于它只允许在队列的头部(Head)进行删除操作,在尾部(Tail)进行插入操作,这种方式的队列我们称之为先进先出队列(FIFO)。 在JDK1.5中推出了队列这一数据结构的具体实现,接口Queue是对于队列的定义,并有一些列具有特殊功能的队列实现。 在Queue接口中定义了队列的如下方法: 其中add(E)并非Qu

小黑说Java 449

【DRAM存储器一】基本存储单元、阵列结构、读写原理

详述DRAM存储器存储单元、存储阵列结构和读写原理

highman110的博客 7250

Java 并发编程面试题——BlockingQueue

本文介绍了与 BlockingQueue 相关的面试题。

代码星辰的博客 1249

MFC实现简单UDP通信(附完整源码)

MFC实现简单UDP通信(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 1108

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

线程池的核心——BlockingQueue

前言 本篇文章会介绍BlockingQueue的概念。 BlockingQueue是java线程池的核心。无论是在面试还是工作中,都是必知必会的知识点。 BlockingQueue的名字就完美概括了这个接口的特点,Queue 是BlockingQueue的父接口,说明它本质还是一个队列。Blocking意为阻塞,说明BlockingQueue相对于普通队列,新增了阻塞的特性。 本文会从BlockingQueue的父接口Queue开始聊起,包括Queue在java 容器中的定位以及API等等。然后介绍Bloc

asd13518662的博客 1246

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

【098期】面试官:精通多线程?你手写过堵塞队列吗?我懵了。。

点击上方“Java精选”,选择“设为星标”别问别人为什么,多问自己凭什么!下方留言必回,有问必答!每天08:08更新文章,每天进步一点点...面试官:你好,你先做个自我介绍吧!某人:面...

Java精选 276

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

Java并发容器实现详解:面试必考点!

《Java并发容器实现详解:面试必考点!》这篇文章深入解析了Java中常用的线程安全容器及其核心实现机制。内容涵盖ConcurrentHashMap、CopyOnWriteArrayList等常用容器的设计思路和性能特点,并结合实际应用场景,为读者提供选型建议。掌握这些知识点是技术进阶和应对高薪面试的必备技能!

yanpeng2580的博客 442

面试官:你手写过堵塞队列吗?我懵了。。

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 5 分钟。来自:blog.youkuaiyun.com/qq_38306425/article/details/109332045...

良月柒 386
上一篇: JAVA并发编程下保证车票出售线程安全之ConcurrentLinkedQueue
下一篇: 详解JAVA选择排序
饶艳辉
博客等级 码龄15年 20粉丝 46原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值