并发编程面试题之常用并发工具类


并发编程面试文章地址链接

内容 博客链接 并发编程面试题之常见面试题 并发编程面试题之 volatile 关键字 并发编程面试题之 CAS 并发编程面试题之锁 并发编程面试题之阻塞队列 待完成… 并发编程面试题之 AQS 待完成… 并发编程面试题之线程池 并发编程面试题之 synchronized 和 ReentrantLock 的区别 并发编程面试题之 ConcurrentHashMap 并发编程面试题之 synchronized 实现原理

常用的并发工具包有哪些

    CountDownLatch CyclicBarrier Semaphore Exchanger

CountDownLatch 与 CyclicBarrier

CountDownLatch 不能重复使用, CyclicBarrier 可以重复使用 j.u.c 中的 CountDownLatch 可以看做是一个计数器, 这个计数器的操作是原子操作, 并且在同一时间只有一个线程去操作这个计数器, 在创建 CountDownLatch 的时候可以设置一个初始值, 任何线程调用这个对象上的 await() 方法都会阻塞, 直到这个计数器的计数值为 0; 所以在计数器为 0 之前, await() 方法会一直被阻塞, 然后会释放所有等待的线程, await 的后续调用都会立即返回, 这种情况只会出现一次, 所以 CountDownLatch 是不能重复使用的; CountDownLatch 的应用场景: 有一个任务想要往下执行, 但是必须等待其他的任务执行完毕后才可以继续往下执行的情况 CyclicBarrier 是一个同步的辅助类, 允许一组线程相互等待, 直到到达了某个 common barrier point, 在一组固定大小的线程的程序中, 这些线程需要一直相互等待, 这个时候就可以使用 CyclicBarrier, 因为 barrier 在释放等待的线程后可以重复使用

Semaphore 的作用

Semaphore 是一个信号量, 它的作用是限制某个代码块的并发数, 在创建 Semaphore 的时候可以阈值 n 代表某段代码最多 n 个线程可以访问, 如果超出了指定的阈值会被阻塞, 直到某个线程执行完毕这段代码, 下一个线程再进入, 如果创建 Semaphore 时候传入阈值是 1, 那么就类似 synchronized

Semaphore 与 ReentrantLock

Semaphore 基本上能完成 ReentrantLock 所有的工作, 其方法的功能与 ReentrantLock 类似, 通过 acquire() 和 release() 方法获取和释放临界区的资源 Semaphore#acquire() 默认是可响应中断锁, 类似 ReentrantLock#lockInterruptibly(), 在临界区中的资源可以被 Thread#interrupt() 释放 Semaphore 与 ReentrantLock 都是要手动的释放锁, 因此都是在 finally 代码块中完成
经验分享 程序员 微信小程序 职场和发展