模拟一个线程调用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
代码结构要比ReentrantLock
和ReentrantReadWriteLock
简单很多,功能也简单,就是基于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)]