【Java多线程手写代码】(四):字节跳动面试官让我手写代码实现启动三个线程累加数字到30

推荐学习!docker启动mysql自动退出 拼多多(三面) 面试前 面完蚂蚁后,早就听闻拼多多这个独角兽,决定也去面一把。首先我在脉脉找了一个拼多多的HR,加了微信聊了下,发了简历便开始我的拼多多面试之旅。这里要非常感谢拼多多HR小姐姐,从面试内推到offer确认一直都在帮我,人真的很nice。 拼多多:一面 为啥蚂蚁只待了三个月?没转正? Java中的HashMap、TreeMap解释下? TreeMap查询写入的时间复杂度多少? HashMap多线程有什么问题? CAS和synchronize有什么区别?都用synchronize不行么? 如 阅读详情

我是少侠露飞。学习塑造人生,技术改变世界。

问题描述

启动三个线程对初始值为0的数字进行累加,要求每个线程累加十次,最终输出30。

问题分析

首先需要启动三个线程(一不小心说了句废话),线程体里面就用循环执行十次自增操作。但是要注意,自增操作不是原子性操作,所以要加锁,或者使用原子变量。
代码很简单,实现一下:

public class Main {
    private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Main-%d").build();

    private static final ExecutorService executorService = new ThreadPoolExecutor(3, 3, 100L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>(1024), threadFactory, new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) throws InterruptedException {
        AtomicInteger num = new AtomicInteger(0);

        for (int i = 0; i < 3; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10; i++) {
                        num.getAndIncrement();
                    }
                }
            });
        }

        System.out.println(num);
    }
}

当你一顿操作猛如虎,点击一运行,发现结果是0,那是自然,主线程启动三个线程之后,接着就执行输出了,三个工作线程还没自增完成呢。这个时候你可能会想到用sleep方法,输出语句之前,让主线程休眠100毫秒。诚然,该方法可行,但是,你不觉得这种操作有点low嘛。
而且真实开发里,正经人谁用sleep方法啊,因为sleep太不可控啦,我就问一点,sleep方法的休眠时间你怎么预估的?是不是懵圈了,因为你完全不知道其它线程执行多久。当然你会说,为确保稳妥,我让它尽量休眠长一点,那好,我这里让主线程休眠一天一夜,程序点击运行之后,大家都回去洗洗睡吧,明天过来看结果。
那有什么办法吗?
当然有啦,还记得我们大名鼎鼎的闭锁CountDownLatch,实现多线程之间的互相等待。关于CountDownLatch可以参考下篇博客↓
Java并发编程(三):CountDownLatch(闭锁)原理及实践

最终代码

public class Main {
    private static final ThreadFactory threadFactory = new ThreadFactoryBuilder().setNameFormat("Main-%d").build();

    private static final ExecutorService executorService = new ThreadPoolExecutor(3, 3, 100L, TimeUnit.MILLISECONDS,
            new LinkedBlockingQueue<Runnable>(1024), threadFactory, new ThreadPoolExecutor.AbortPolicy());

    public static void main(String[] args) throws InterruptedException {
        AtomicInteger num = new AtomicInteger(0);
        CountDownLatch countDownLatch = new CountDownLatch(3);

        for (int i = 0; i < 3; i++) {
            executorService.submit(new Runnable() {
                @Override
                public void run() {
                    for (int i = 0; i < 10; i++) {
                        num.getAndIncrement();
                    }
                    countDownLatch.countDown();
                }
            });
        }

        countDownLatch.await();
        System.out.println(num);
    }

}
字节跳动秋招面试经验分享 1.写在前面 一转眼离自己秋招已经过去了一年了,还能回想起秋招时那种不自住产生焦虑的感觉 自己在准备秋招时也看很多人分享了自己的面经,对自己的秋招有很大的帮助,又是一年秋招季也为大家分享一些当时秋招的经验 2.本人情况 我是 211 本 + 985 硕计算机相关专业 在读研期间研究的是深度学习相关内容,读研期间也没有去实习过 在准备找工作时候很清楚知道走算法神仙打架的路对于我而言非常遥远,整个复习的过程就主要准备 Java 开发的相关内容 确立了找开发的方向也没有太确定以后要走什么样的路, 阅读详情

相关推荐

2020届春招实习面经(含阿里、腾讯、网易、京东、华为、美团、快手、字节跳动)

前言: 之前发表了一篇实习复习的内容: 史上最全!20/21届春招/秋招 实习/校招 JAVA面试全攻略!复习回顾这一篇就够了! 在这篇文章详细说了该如何去复习,也答应各位把面经整理一下,但是因为入职的事情耽搁了,现在整理出来回馈给大家! PS:楼主只收到网易、快手、华为三家offer,也不是所谓的offer收割机。只是提供一些个人经验,这个平台帮了我很多,前人栽树后人乘凉,共勉! 文章目录快手(已offer)一面(60mins)二面(55mins)HR面(15mins)阿里一面腾讯一面(40mi.

程序员世杰 3990

三个线程对一个数求和

public class Test implements Runnable { private static volatile int count = 0 ; //使用 volatile 修饰基本数据内存不能保证原子性 //private static AtomicInteger count = new AtomicInteger() ; public void run(...

liuwen0730的博客 525

G2O (General Graph Optimization)入门及简单使用

g2o全称是General Graph Optimization,也就是图优化,我们在做SLAM后端或者更加常见的任何优化问题(曲线拟合)都可以使用G2O进行处理。

晓晨的博客 1万+

10个线程实现每个线程累加10次,将多个线程的结果累加

java多线程实现的一种方式: 根据对题目的理解,自己实现了一种,其中使用了 CyclicBarrier,通过设置内存屏障,等待其他都进行累加操作之后,在通过异步的方式将多个线程的和进行累加,代码如下 public class ThreadTest { public static void main(String[] args) { CyclicBarrier cyclicBarrier = new CyclicBarrier(10); ThreadPool.

dangyongkang的博客 1993

极化码理论及算法研究6-SCL、CA-SCL及matlab仿真

极化码译码算法5——SCL/CA-SCL译码算法系列目录1、引言2、串行抵消列表(SCL)译码算法2.1、路径度量PM 系列目录 (如要找其他内容,欢迎访问我的主页寻找) #前言 #极化码概述 #极化码定义 #极化码编码 #极化码译码 #5G标准中极化码的编译码概述 #5G标准中极化码的编码 #5G标准中极化码的译码 #总结 1、引言 在上一节中,介绍了经典的SC译码算法的理论原理以及其matlab仿真代码,SC译码算法具有较低的译码复杂度,但是由于每个译码的比特信息都依赖于前面所有的比特信息的译码结果,得

1万+

使用python排八字 计算八字的相合相冲五行分值等 ...

简介 八字术是一种古老的算命术。它运用阴阳、五行、干支、八卦等理论,把人的出生年月日时转化为八个字,进而推算人的富贵贫贱、祸福吉凶、穷通寿天、名利地位、家庭六亲等方面的情况 八字源自古代的中国,是一种利用天干和地支来准确记录年、月、日、时的方式,由“年干,年支”、“月干,月支”、“日干,日支”、“时干,时支”,共八个干支所组成(共八个字),年、月、日、时...

weixin_33717298的博客 5310

多线程练习--请用多线程显示,每三个数字为一组,直到30.

线程A:1 线程A:2 线程A:3 线程B:4 线程B:5 线程B:6 线程A:7 线程A:8 线程A:9 ...(直到显示30) 3个一组输出30个数 public class TestSange { public static void main(Str...

chuteng3602的博客 195

PyTorch GPU版本安装避坑指南:解决RuntimeError: No CUDA GPUs are available报错

本文详细解析了PyTorch GPU版本安装过程中常见的`RuntimeError: No CUDA GPUs are available`报错问题,从硬件驱动检查、CUDA Toolkit与cuDNN安装到PyTorch GPU版本的正确配置,提供了全面的避坑指南和实战验证方法,帮助开发者高效搭建深度学习开发环境。

r2s3t4的博客 297

Java三线程输出数字_java启动3个线程轮流打印数字

id0:1,2,3,4,5,id1:6,7,8,9,10,id2:11,12,13,14,15,id0:16,17,18,19,20,id1:21,22,23,24,25,id2:26,27,28,29,30,id0:31,32,33,34,35,id1:36,37,38,39,40,id2:41,42,43,44,45,id0:46,47,48,49,50,id1:51,52,53,54,55,...

weixin_33552230的博客 910

Linux系统故障排查思路实践教程(上)

本文主要介绍了Linux系统日志分析与常见故障排查的实用方法。首先从系统日志的分类及其涉及的日志文件进行说明;其次详细讲解了忘记用户密码的解决方案;接着对系统无法启动问题,提供了异常断电后修复文件系统、/etc/fstab文件丢失恢复等常见故障的处理方案。最后介绍了文件系统只读错误的排查思路和修复方法,包括磁盘空间检查、文件系统修复等实用技巧。全文提供了大量具体命令和操作流程,为Linux系统维护人员提供了实用的故障处理指南。

提供C#相关开发 、云计算、运维测试、网络安全相关技术分享与服务,有意向可联系。 328

Claude Code、Codex、Gemini CLI、OpenCode 和 OpenClaw 配置管理太麻烦?试试这个统一管理工具

还在为 Claude Code、Codex、Gemini CLI 等 AI CLI 配置烦恼?🤯 这款桌面工具支持五大助手统一管理,一键切换 50+ 服务商,MCP 和 Skills 集中管理 🛠️,跨平台支持,让你的 AI 编程更高效 ⚡

XiaoqiangClub的博客 913

三个线程顺序循环输出

先看一个简单的:t1 t2 t3三个线程,按顺序串行执行如何实现? 除了使用newSingleThreadPool整一个单工作线程的线程池/使用一个阻塞队列之外. 用线程类的join()方法在一个线程中启动另一个线程,另外一个线程完成该线程继续执行,为了确保三个线程的顺序你应该先启动最后一个(T3调用T2,T2调用T1),这样T1就会先完成而T3最后完成。 Thread类中的join方法的主要作用就是同步,它可以使得线程之间的并行执行变为串行执行。当我们调用某个线程的这个方法时,这个方法会挂起调用线程.

Oblak_ZY的博客 1249

uniapp [全端兼容] - 详细实现用户电子签名 “逐字校验“ 将姓名按字拆开分别手写签署签字,把客户名字自动拆成单独的文字并由用户逐个依次签名与汉字笔画校验,支持汉字格、田字格、米字格、方格等!

uniapp,h5移动端网页,微信小程序,支付宝小程序,Android安卓,苹果ios,app,nvue,手写签名,电子签署,逐个字挨着写,写名字,将客户姓名分成单独的文字并依次手写,在田字格里写名字,米字格,方格,合同,书写轨迹,验证手写的文字是否正确,如何在uni-app做姓名拆分成独立的文字后手写每一个字,校验正确性,画板,汉字生成在米字格里并且让用户去写,如何画一个汉字田字格,vue把姓名拆分单独写签名,文字,拆掉,中文汉字网格,一个字一个字签名,一次只签名一个文字,判断签名的文字笔画是否正确,Un

🏆 前端领域优质创作者 1万+

记第一次实习面试经历(字节跳动)

笔者2.17号接到面试邀约,3.4号第一波抖音面试,四次技术面后被拒,奋起直追又找人又进行了二次内推(主要是第一次被拒的有点不明不白),从第二次内推到HR面试给口头Offer大概一周,本文主要记录从开始面试到最后面试完成的一些经历和经验,希望可以帮助到各位还在找工作的小伙伴们。 面试TimeLine&面试主要题目 2019.2.17 17:00 投出简历,字节跳动,base北京 2...

ai-exception的博客 1万+

用 SNC 和 SAP Single Sign-On Secure Login 把 SAP 登录这件小事,变成一件安全又不用输密码的事

在传统的 SAP 系统里,登录这件事看起来很朴素:用户打开 SAP GUI,输入一个 SAP 用户名,再输入一个 SAP 密码,点回车,进系统,开始干活。表面上没毛病,但从安全角度看,这种老办法问题很大。默认情况下,这些用户名和密码在网络上传输时是明文,也就是不加密传输。攻击者如果在公司网络里做监听,理论上可以直接截取到口令信息,这种风险对今天任何一家合规要求高、审计严格的企业来说,基本是不可接受的。(SAP Help Portal)SAP 给出的答案叫做 ,全称是 。SNC 做的事情可以概括成两类:一类是

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 376

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

【字节跳动面经】Java后台研发2020面试真题(商业变现部门一面)

字节跳动商业变现部门一面面试题及回答要点

少侠露飞的学习笔记 1244

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

程序员,背熟这99道Java多线程面试题,和面试官扯皮就没问题了!(1)

synchronized关键字可以时间一个简单的策略来防止线程干扰和内存一致性错误,如果一个对象是对多个线程可见的,那么对该对想的所有读写都将通过同步的方式来进行。不可被中断的一个或一系列操作问题:因为cas需要在操作值的时候,检查值有没有变化,如果没有变化则更新,如果一个值原来是A,变成了B,又变成了A,那么使用cas进行检测时会发现发的值没有发生变化,其实是变过的。解决:添加版本号,每次更新的时候追加版本号,A-B-A —> 1A-2B-3A。

2401_84023262的博客 570

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

精雕软件(JDpaint) 5.5 绿色版

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

最强整理!字节跳动历年Android中高级面试题全收录!附超全教程文档

开头 让我们一起来看看,字节跳动的第三面,面试官都问了什么?(第一二面的题目及答案已整理,需要的可以在文末领取) 从七月中旬开始,我前前后后差不多一共投递了八十份简历,到目前为止,我参加面试的面试有十二家(收到的面试通知) 字节跳动的面试我准备了一个多星期吧,因为比较重视。 从字节跳动面试官这些问题,可以看出,第三面他们考察的一个很重要的方向就是项目架构和性能优化。 “懒洋洋”甚至跟我吐槽:“我靠,现在大厂面试java后端都这么难的吗?” 大厂面试就是难,但是大厂的待遇是真的香!最近不是都在讨论华为的工资到

m0_57079376的博客 233

字节跳动历年Android中高级面试题全收录!附超全教程文档

开头 让我们一起来看看,字节跳动的第三面,面试官都问了什么?(第一二面的题目及答案已整理,需要的可以在文末领取) 从七月中旬开始,我前前后后差不多一共投递了八十份简历,到目前为止,我参加面试的面试有十二家(收到的面试通知) 字节跳动的面试我准备了一个多星期吧,因为比较重视。 从字节跳动面试官这些问题,可以看出,第三面他们考察的一个很重要的方向就是项目架构和性能优化。 “懒洋洋”甚至跟我吐槽:“我靠,现在大厂面试java后端都这么难的吗?” 大厂面试就是难,但是大厂的待遇是真的香!最近不是都在讨论华为的工资到

m0_56259669的博客 340

字节跳动面试官:单机下如何让Java程序支持百万长连接?

输入命令后,会出现1 024的数字,表示Linux系统中一个进程能够打开的最大文件数,由于开启一个TCP连接就会在Linux系统中对应创建一个文件,所以就是受这个文件的最大文件数限制。实际上,为了模拟查询数据性能,getResult()传入的参数是由客户端传过来的时间戳,最终返回的还是客户端传过来的值。前面的*表示当前用户,hard和soft分别表示限制和警告限制,nofile表示最大的文件数标识,后面的数字1 000 000表示任何用户都能打开100万个文件,这也是操作系统所能支持的最大值,如下图所示。

2301_79098686的博客 779

成功入职字节跳动Android岗,定级2-2,入职就是30K-16薪,全靠这份PDF!

那我先问个简单的吧,简单说下activity的启动模式吧?现在有个场景:Activity A 启动 B ,B为 singleInstence启动模式 ,B启动 C , 这时候 在C页面按返回键,会退回到哪,再按返回退回哪?View的绘制流程,测量传参的形式。Fragment的启动栈和回退栈。Service的启动方式、Service内是否可以直接做耗时操作、广播内是否可以直接做耗时操作?AIDL的基本流程(如何实现AIDL),不用AIDL是否可以实现进程间通讯,用什么,如何实现?

2401_84545291的博客 769

新鲜的字节跳动实习面经(Android开发岗)

开篇 先说明一下, 楼主是二本双非学校,科班生,有三个App上架,这学期大四。7月1号投了字节的简历, 7月中旬参加了笔试,7月底收到字节面试邀请。8月初参加了第一轮面试,8月中旬参加了二面,8月27日参加了三面。9月7日 offer mail。 面试过程 一面 自我介绍 大聊实习经历(真的聊了蛮久) 死锁 线程和进程的区别 如何保证线程安全 synchronized和lock的区别 看过/用过什么Android第三方库 Android申请权限的流程 View的绘制流程(不会) 那假如让我自己写一个自定义

zhireshini233的博客 561

备战三个月,四轮面试拿下字节offer...

整份文档一共有将近 1700+ 页,全部为大家展示出来肯定是不太现实的,为了不影响大家的阅读体验就只展示了部分内容,还望大家海涵,希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习!

Android 开发架构 550

安卓工程师面试题及答案,Android多线程断点续传,进阶学习资料!

大家应该看过很多分享面试成功的经验,但根据幸存者偏差的理论,也许多看看别人面试失败在哪里,对自己才更有帮助。 最近跟一个朋友聊天,他准备了几个月,刚刚参加完字节跳动面试,第二面结束后,嗯,挂了… 所以啊,不管怎么样,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流~ 面试题目 对于面试的准备,算法建议对着牛客网刷下《剑指Offer》和《算法》,然后之前项目中用到的第..

m0_56255252的博客 192

大厂提前批7月陆续启动:软件测试岗的“黄金30天”怎么抢?

更重要的是,大厂的测试岗早已不是“手工测试”——自动化测试、AI测试、安全测试、性能测试才是主流。字节跳动的测试开发工程师岗位明确要求“扎实的数据结构和算法基础,熟悉至少一门编程语言”,干的活和开发没什么本质区别,只是关注点从“写功能”变成了“保质量”。大厂的测试开发干的是自动化框架搭建、测试工具开发、质量平台建设,不是“点点点”。薪资接近开发、发展路径清晰、需求量稳定——测试开发是校招里性价比最高的岗位之一,没有“之一”可能也不夸张。腾讯的测试开发岗与前端、后台、游戏客户端并列在技术研发提前批中。

ceshiren_com的博客 173

字节跳动Android实习面试凉凉经,在阿里工作5年了

较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频**如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)[外链图片转存中…(img-b7YDc4f4-1710049518497)]想要了解更多关于大厂面试的同学可以**点击这里Android学习PDF+架构视频+源码笔记高级架构技术进阶脑图、Android开发面试专题资料,高级进阶架构资料这几块的内容。分享给大家,非常适合近期有面试和想在技术道路上继续精进的朋友。

m0_61331407的博客 886
上一篇: 【Java多线程手写代码】(三):快手面试官让我手写代码实现三个线程按序输出1 2 3 4 5, 6 7 8 9 10, 11 12 13 14 15...
下一篇: 【Java多线程手写代码】(五):如何优雅的实现生产者、消费者
少侠露飞
博客等级 码龄9年 214粉丝 117原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值