头条基础架构 - 面试题 - 三个线程并发打出ABC的字母

本文探讨了字节跳动基础架构面试中的一道问题:如何使用并发编程技术,使三个线程按照ABC的顺序并发打印字符串。文章提供了两种解决方案:一是利用Lock和Condition,通过控制线程的等待和唤醒来保证顺序;二是采用Semaphore信号量,通过设置三个信号量分别对应A、B、C线程,确保线程按顺序执行。
摘要由CSDN通过智能技术生成

题目描述

字节跳动基础架构岗的终面问题:
有三个线程,分别能够打出A,B,C三个字母,如何让它们并发协作的打出ABCABCABC…这样的字符串?(仅使用ReentrantLock的功能)

思路一 Lock

使用一个lock与对应创建的condition,思路如下:

  1. 使用一把锁来控制同时三个线程的串行执行,但此时仍无法保证三个线程抢到锁的顺序;
  2. 发现当前不应该自己输出时,使用condition进入await状态;
  3. 在成功打印后,使用condition唤醒其它沉默的线程;

那么通俗来讲,流程就变成三个人不断抢锁,抢到锁后发现没轮到自己干活的时候,就先去睡觉。成功抢到锁并打印内容后,把其它线程叫醒并继续抢锁。直到所有人都输出了指定数量的字母。

public class AbcThread extends Thread {
   

    private final int index;
    private final Lock lock;
    private final Condition cond;

    private static volatile int cnt = 0;
    private static final char[] CHARS = {
   'A','B','C'};
    private static final int SIZE = 100;

    public AbcThread(int index, Lock lock, Condition cond) {
   
        this.index = index;
        this.lock = lock;
        this.cond = cond;
    }

    @Override
    public void 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值