java多线程的几个层次

一、基础

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、哲学家竞争

猜你喜欢

转载自eric-weitm.iteye.com/blog/2395559