并发编程是什么
所谓并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生
并发编程的目标
并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能
并发编程解决的核心问题
第一、分工
所谓分工指的是如何高效的拆解任务并分配给线程
JDK并发包里的Executor,Fork/Join,Future本质上都是线程的分工,除此之外,并发编程领域同时也总结了一些设计模式,基本都是和线程间的公共
1、Executor和线程池
2、Fork/Join
3、Future
4、Balking模式
5、Thread-Per-Message模式
6、Guarded Suepension模式
7、Worker Thread模式
8、生产者-消费者模式
9、两阶段终止模式
第二、同步
所谓同步指的是线程之间如何协作
分好工之后,就是具体的执行了,在项目的执行的过程中,任务之间是有依赖关系的,一个任务的结束后,依赖它的任务就可以开始工作了,后续工作怎么知道要开始工作了呢?这个依靠的就是沟通协作了。Java JDK里提供的CountDownLatch、CyclicBarrier、Phaser、Exchanger都是解决线程协作的问题
1、Semaphore
2、CountDownLatch
3、CyclicBarrier
4、Phaster
5、Exchanger
6、管程
第三、互斥
互斥则是保证同一时刻只允许一个线程访问共享变量
实现互斥的核心技术是锁,Java语言里sychronizrd、SDK里的各种Lock都能解决互斥问题。虽然解决了各种安全性问题,但同时也带来了性能问题,那如何保证安全性的同时又尽量提高性能的呢?Java SDK里提供的ReadWriteLock、StampedLock就可以优化读多写少的场景。还可以使用无锁的数据结构优化,例如Java SDK里提供的原子类都是基于无锁技术实现的。除此之外,还有一些其它方案,原理是不共享变量或者变量只允许读。Java提供了ThreadLocal和final关键字,还有一种Copy-on-write的模式
无锁
1、不变模式
2、线程本地存储
3、CAS
4、Copy-on-Write
5、原子类
互斥锁
1、synchronized
2、Lock
3、WriteReadLock