Java concurrent programming
[TOC]
基础理论篇
- CPU、OS,多任务抢占式
- 上下文切换
- 同步VS异步、并行VS并发、死锁VS活锁、
JVM实现机制
- JMM:原子性、可见性、有序性
- 指令重排:Happen-Before规则、as-if-serail规则
- 临界区
- Java对象头:JVM规范,排他锁,轻量级锁,偏向锁
JDK源码
- synchronized
- volatile
- final
- CAS
- unsafe Java的指针
- Lock(乐观锁、悲观锁、公平锁、非公平锁、独占锁、共享锁、可重入锁、自旋锁),锁优化
- AQS,LockSupport,ReentrantLock,ReentrantReadWriteLock,StampedLock,
- 并发容器:CopyOnWriteArrayList,ConcurrentLinkedQueue,LinkedBlockingQueue,ArrayBlockingQueue,PriorityBlockingQueue,DelayQueue,Collections.Synchronized wrapper
- Atomic, LongAdder, LongAccumulator
- Thread Group
- ThreadPoolExecutor,ScheduledThreadPoolExecutor
- ThreadLocal
- Fork/Join
- CountDownLatch
- CyclicBarrier
- Semaphore
- 并行任务:Future,CompletableFuture
Design Pattern in JCP
- Singleton
- Consumer & Producer
- Pub & Sub
- Template Method
- Factory
- Proxy
- Disruptor
Thread state diagram
- state option [new - runnable - terminated - waiting - waiting-timeout - blocked]
- start
- run
- stop
- interupt
- join
- wait
- sleep
- notify
- yield
- suspend
- resume
Append
1
2
3
4
5
6
7
8
9
1/ distinguish [this thread] VS [current executing thread]
2/ daemon thread VS user thread
3/ CPU cache @sun.misc.Contented 字节填充 LongAddr Array VS List
4/ 乐观锁 VS 悲观锁 sql for update -> 提升TPS
5/ ThreadLocal VS InheritableThreadLocal,ThreadLocal时内存泄露,使用完remove()
6/ LongAdder > AtomicLong LongAccumulator
7/ CopyOnWriteArrayList COW(Redis的持久化) 弱一致性 平行宇宙
8/ StampedLock 带有version的optimistic Lock
9/ Future.get(),需带有Timeout参数,否则会因为线程池的一些RejectPolicy导致阻塞而永远不返回
JCP in action
- JMH,IDEA插件
- slf4j - logback - ArrayBlockingQueue
- Tomcat NIO NioEndpoint Daemon(true)
- Disruptor无锁环形内存队列
- Akka - Actor - Scala - event-driven msg
- Reactor Pattern - netty The purpose of the Reactor design pattern is to avoid the common problem of creating a thread for each message, request, and connection.
- select, poll, epoll, and kqueue.
- Thread-based architecture VS Event-driven architecture