题目描述
字节跳动基础架构岗的终面问题:
有三个线程,分别能够打出A,B,C三个字母,如何让它们并发协作的打出ABCABCABC…这样的字符串?(仅使用ReentrantLock的功能)
思路一 Lock
使用一个lock与对应创建的condition,思路如下:
- 使用一把锁来控制同时三个线程的串行执行,但此时仍无法保证三个线程抢到锁的顺序;
- 发现当前不应该自己输出时,使用condition进入await状态;
- 在成功打印后,使用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