基础
从 JDK 版本升级来看 Java 多线程发展
concurrent 并发包
并发容器
同步线程
原子对象
锁
Fork-join 框架
线程池
ThreadLocal
线程池
锁
【基本功】不可不说的Java“锁”事
Synchronized与ReentrantLock区别总结(简单粗暴,一目了然)
- synchronized 是 Java 的关键字,ReenTrantLock 是 API,Synchronized的使用比较方便简洁,并且由编译器去保证锁的加锁和释放,而ReenTrantLock需要手工声明来加锁和释放锁,为了避免忘记手工释放锁造成死锁,所以最好在finally中声明释放锁。
- 性能差不多,synchronized 经过优化后。
- ReenTrantLock 提供了一些高级功能,等待可中断,公平锁,锁绑定多个条件。
CAS
CAS虽然很高效,但是它也存在三大问题,这里也简单说一下:
- ABA问题。CAS需要在操作值的时候检查内存值是否发生变化,没有发生变化才会更新内存值。但是如果内存值原来是A,后来变成了B,然后又变成了A,那么CAS进行检查时会发现值没有发生变化,但是实际上是有变化的。ABA问题的解决思路就是在变量前面添加版本号,每次变量更新的时候都把版本号加一,这样变化过程就从“A-B-A”变成了“1A-2B-3A”。
- JDK从1.5开始提供了AtomicStampedReference类来解决ABA问题,具体操作封装在compareAndSet()中。compareAndSet()首先检查当前引用和当前标志与预期引用和预期标志是否相等,如果都相等,则以原子方式将引用值和标志的值设置为给定的更新值。
- 循环时间长开销大。CAS操作如果长时间不成功,会导致其一直自旋,给CPU带来非常大的开销。
- 只能保证一个共享变量的原子操作。对一个共享变量执行操作时,CAS能够保证原子操作,但是对多个共享变量操作时,CAS是无法保证操作的原子性的。
Java从1.5开始JDK提供了AtomicReference类来保证引用对象之间的原子性,可以把多个变量放在一个对象里来进行CAS操作。
同步容器
Vector
Stack
HashTable
Collections提供的同步集合类
ArrayBlockingQueue
LinkedBlockingQueue
PriorityBlockingQueue
DelayQueue
并发容器
Map
ConcurrentHashMap
谈谈ConcurrentHashMap1.7和1.8的不同实现
List
CopyOnWriteArrayList
Set
CopyOnWriteArraySet
Queue
ConcurrentLinkedQueue
原子对象
AtomicInteger
通过CAS来实现了乐观锁,AtomicInteger的自增函数incrementAndGet()的源码时,发现自增函数底层调用的是unsafe.getAndAddInt()。
同步设备
- CountDownLatch
- CyclicBarrier
- Semaphore