一、基础
1、jvm跨平台说的是跨硬件和OS平台,是面向机器的低层次的虚拟机
2、内存划分为main memory(对应裸机内存)和每个线程的工作内存(对应进程用户空间)。
3、java线程对应os的进程,工作空间对应进程的用户空间,jvm对应硬件
4、主内存的指令:lock(锁定到某个线程) unlock read write
线程工作内存指令:load store use assign 。所有的函数内的操作,都针对线程的工作空间内存。
5、linux中。一个java线程对应一个内核线程(轻量进程)
6、CAS:自旋锁,乐观锁,不是每次强制切换上下文环境,而是短时间的轮训和等待,相当于锁的粒度更小了。CAS的原理:循环处理,每次比较假设和设置,一般不冲突的会直接成功,适合于并发冲突不是非常明显的情况。
7、java线程是抢占式的调度
8、synchronized 默认锁住的是 this对象,static synchronized 锁住代码段,都是悲观锁
二、java并发的抽象层次
1、lock condition 对应posix的线程原语,可以细粒度的控制并发。
ReadWriteLock:可以多个线程读,一个写,可以降级;
ReentrantReadWriteLock: 可重入可以实现更高的吞吐率
2、volatile:一个线程的修改别的线程可以看到;不允许指令重排序优化。(不能实现并发写)
3、atomicXXX 使用乐观锁实现的原子更新数据类型
4、线程安全的集合类 ConcurrentHashMap
CopyOnWriteArrayList
BlockingQueue
ArrayBlockingQueue 内部实现是将对象放到一个数组里(固定长度、省内存)
DelayQueue 每个元素的 getDelay() 方法返回的值的时间段之后才释放掉该元素
LinkedBlockingQueue 以一个链式结构(链接节点)对其元素进行存储
PriorityBlockingQueue 取出时有优先级
SynchronousQueue 只能容纳一个元素
BlockingDeque(LinkedBlockingDeque) 双端操作,分别支持在first和last端的操作
ConcurrentNavigableMap
5、线程间交互
CountDownLatch 等对方结束
CyclicBarrier:到了地方一起开始
Semaphore:控制并发线程个数
Exchanger :分别做,在固定的地方进行协调
Phaser:复杂过程的同步控制
6、消息队列,线程池
ExecutorService Callable(会返回结果) Future(get时如果没有结果会阻塞)
几种线程池的区别:
newCachedThreadPool:有空闲用空闲,没有就新建,不限制总个数
newFixedThreadPool:控制总个数
newScheduledThreadPool:可以调度
newSingleThreadExecutor:单线程,保证先进先出
newWorkStealingPool:自己队列空闲时,可以帮助别的线程干活,适合于处理时间差异较大时(线程切换,本身有消耗)
7、ForkJoinPool 分叉和合并(分治策略),类似于map reduce的
三、并发模型抽象
1、生产、消费
2、读写
3、哲学家竞争