文章目录
并发编程面试文章地址链接
内容 | 博客链接 |
---|---|
并发编程面试题之常见面试题 | 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 |
并发编程面试题之 synchronized 和 ReentrantLock 的区别 |
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()
释放
Semaphore
与ReentrantLock
都是要手动的释放锁, 因此都是在finally
代码块中完成