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


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

内容 博客链接
并发编程面试题之常见面试题 https://blog.csdn.net/weixin_38251871/article/details/104658674
并发编程面试题之 volatile 关键字 https://blog.csdn.net/weixin_38251871/article/details/104667384
并发编程面试题之 CAS https://blog.csdn.net/weixin_38251871/article/details/104667406
并发编程面试题之锁 https://blog.csdn.net/weixin_38251871/article/details/104667392
并发编程面试题之阻塞队列 待完成…
并发编程面试题之 AQS 待完成…
并发编程面试题之线程池 https://blog.csdn.net/weixin_38251871/article/details/104675416
并发编程面试题之 synchronizedReentrantLock 的区别 https://blog.csdn.net/weixin_38251871/article/details/104667532
并发编程面试题之 ConcurrentHashMap https://blog.csdn.net/weixin_38251871/article/details/104667433
并发编程面试题之 synchronized 实现原理 https://blog.csdn.net/weixin_38251871/article/details/104667415

常用的并发工具包有哪些

  • 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() 释放
    SemaphoreReentrantLock 都是要手动的释放锁, 因此都是在 finally 代码块中完成
发布了22 篇原创文章 · 获赞 3 · 访问量 796

猜你喜欢

转载自blog.csdn.net/weixin_38251871/article/details/104677582