高并发
Senior Java 高并发
Published: 2020-04-20

The article contains the knowledge of high concurrency…

锁只能锁堆上的元素,不能锁栈上的元素

Wait会释放锁,notify不会释放锁

Countdownlatch/cyclicbarrier/semaphore

ReentrantLock

ReentrantLock:

  • Trylock (可设置delay,规定时间内没拿到线程就不拿了)

  • lockInterruptibly(不想让线程再等了,用主线程通知他别等了)

  • reentrantLock(true) 公平锁

ThreadLocal

ThreadLocal(线程自己用,别的线程用不了)

currentLinkedQueue

concurrentSkipListMap(排好序的,因此插入时效率低)

BlockingQueue

SynchronusQueue

SynchronusQueue没有容量,每放进去一个就必须被消费掉,如果用add,则报错,如果用put,则阻塞(这里的put内部就是transfer)

(Array有界Linked无界)

Run()方法不返回值,不抛异常,call()方法返回值,抛异常

LinkedTransferQueue

LinkedTransferQueue调用transfer的时候,如果没有执行线程,则会阻塞,调用其他例如offer,put之类的就不会阻塞

Threadpoolfactory

Threadpoolfactory可以用来指定线程的名字

CompletableFuture和CompletionService

其中CompletableFuture是jdk1.8之后出来的,更为推荐

参考博客:https://blog.csdn.net/zangdaiyang1991/article/details/84333995

AQS(AbstractQueuedSynchronizer)

参考:https://blog.csdn.net/weixin_43767015/article/details/120077925(AQS(AbstractQueuedSynchronizer)源码深度解析(1)—AQS的总体设计与架构)、https://blog.csdn.net/weixin_43767015/article/details/120078253(AQS(AbstractQueuedSynchronizer)源码深度解析(2)—Lock接口以及自定义锁的实现)、https://blog.csdn.net/weixin_43767015/article/details/120078891(AQS(AbstractQueuedSynchronizer)源码深度解析(3)—同步队列以及独占式获取锁、释放锁的原理)、https://blog.csdn.net/weixin_43767015/article/details/120079595(AQS(AbstractQueuedSynchronizer)源码深度解析(4)—共享式获取锁、释放锁的原理)、https://blog.csdn.net/weixin_43767015/article/details/106957989(AQS(AbstractQueuedSynchronizer)源码深度解析(5)—条件队列的等待、通知的实现以及AQS的总结)

ReentrantReadWriteLock读写锁

参考:https://blog.csdn.net/qq_42651904/article/details/115026768(ReentrantReadWriteLock详解)

StampedLock读写锁

StampedLock是比ReentrantReadWriteLock更快的一种锁,支持乐观读、悲观读锁和写锁。和ReentrantReadWriteLock不同的是,StampedLock支持多个线程申请乐观读的同时,还允许一个线程申请写锁

注意:StampedLock的底层并不是基于AQS的

参考:https://blog.csdn.net/qq_40276626/article/details/119873114(StampedLock详解)

LongAddr思想

AtomicLong通过CAS算法提供了非阻塞的原子性操作,相比受用阻塞算法的同步器来说性能已经很好了,但是JDK开发组并不满足于此,因为非常高并发的请求下AtomicLong的性能是不能让人接受的,原因是AtomicLong的incrementAndGet的代码,虽然AtomicLong使用CAS算法,但是CAS失败后还是通过无限循环的自旋锁去的尝试,这就是高并发下CAS性能低下的原因所在

为了解决这个问题,LongAddr就诞生了。LongAdder类是JDK1.8新增的一个原子性操作类

参考:https://blog.csdn.net/jiangtianjiao/article/details/103844801/(LongAdder原理分析)

协程

协程只有和异步IO结合起来才能发挥出最大的威力

参考:https://blog.csdn.net/ThinPikachu/article/details/121325198(协程详解)

补充

FutureTask中的get是阻塞方法

execute()执行runnable,不用返回值,submit执行runnable或者callable

一个线程池维护两个队列,一个是任务队列,一个是已完成任务队列

Workstealingpool — 线程池中所有线程都是精灵线程(forkjoinpool也一样)

Threadpoolexecutor

parallelStreamAPI

runtime.getRuntime().availableprocessors() 打印有多少个cpu核

forkjoinpool中recursiveAction没有返回值,recursiveTask有返回值