用一句话说明白CountDownLatch倒数器的原理

模拟一个线程调用countDownLatch.await(),另外10个线程调用countDownLatch.countDown()

public class Test1071 {

public static void main(String[] args) throws InterruptedException {

CountDownLatch countDownLatch = new CountDownLatch(10);

new Thread(new Runnable() {

@Override

public void run() {

try {

System.out.println(Thread.currentThread().getName() + " invoke countDownLatch.await()");

countDownLatch.await();

System.out.println(Thread.currentThread().getName() + “,被唤醒。。”);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}).start();

for (int i = 0; i < 10; i++) {

new Thread(new Runnable() {

@Override

public void run() {

System.out.println(“countDown…”);

countDownLatch.countDown();

}

}).start();

}

}

}

//控制台输出

Thread-0 invoke countDownLatch.await()

countDown…

countDown…

countDown…

countDown…

countDown…

countDown…

countDown…

countDown…

countDown…

countDown…

Thread-0,被唤醒。。

CountDownLatch基本结构


CountDownLatch代码结构要比ReentrantLockReentrantReadWriteLock简单很多,功能也简单,就是基于AQS共享锁实现一个倒数器的功能。

public class CountDownLatch {

/**

  • Synchronization control For CountDownLatch.

  • Uses AQS state to represent count.

*/

private static final class Sync extends AbstractQueuedSynchronizer {

private static final long serialVersionUID = 4982264981922014374L;

Sync(int count) {

setState(count);

}

int getCount() {

return getState();

}

protected int tryAcquireShared(int acquires) {

return (getState() == 0) ? 1 : -1;

}

protected boolean tryReleaseShared(int releases) {

// Decrement count; signal when transition to zero

for (;😉 {

int c = getState();

if (c == 0)

return false;

int nextc = c-1;

if (compareAndSetState(c, nextc))

return nextc == 0;

}

}

}

private final Sync sync;

public void await() throws InterruptedException {

sync.acquireSharedInterruptibly(1);

}

public boolean await(long timeout, TimeUnit unit)

throws InterruptedException {

return sync.tryAcquireSharedNanos(1, unit.toNanos(timeout));

}

public void countDown() {

sync.releaseShared(1);

}

public long getCount() {

return sync.getCount();

}

public String toString() {

return super.toString() + "[Count = " + sync.getCount() + “]”;

}

}

最后

无论是哪家公司,都很重视基础,大厂更加重视技术的深度和广度,面试是一个双向选择的过程,不要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

要抱着畏惧的心态去面试,不利于自己的发挥。同时看中的应该不止薪资,还要看你是不是真的喜欢这家公司,是不是能真的得到锻炼。

针对以上面试技术点,我在这里也做一些分享,希望能更好的帮助到大家。

[外链图片转存中…(img-ERS4R2K4-1720121298928)]

[外链图片转存中…(img-FXVOxjDO-1720121298929)]

[外链图片转存中…(img-3gaMsOZ3-1720121298929)]

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值