java并发变成艺术_Java并发编程的艺术

一、Java并发机制的底层实现原理

volatiole应用

volatile的定义与实现原理

java内存模型保证所有线程看到volatile变量是一致的

当前处理器缓存行的数据回写到内存中; 2、回写到内存中的操作会使得其他CPU缓存该内存地址数据无效

缓存一致性协议 MESI

volatile的使用优化

用一种追加字节的方式来优化队列的出队和入队的性能

synchronized的实现与应用

JVM基于进入和退出Monitor对象来实现代码块的同步

java对象头

锁的升级和优化

偏向锁

轻量级锁 -》自旋锁

重量级锁

原子操作的实现原理

处理器如何实现原子操作

总线锁

缓存锁

java如何实现原子操作

通过锁或者循环CAS来实现原子操作

CAS实现原子操作的三大问题

ABA问题: AtomicStampedReference

循环时间开销大

只能保证一个共享变量的原子操作: AtomicReference, 将多个变量放在一个对象进行CAS操作

锁机制

除了偏向锁, JVM实现锁的方式都用了缓存CAS

二、Java内存模型

Java内存模型的基础

并发编程模型的两个关键问题: 线程之间如何通信及线程之间如何异步

Java内存模型的抽象结构

从源代码到指令序列的重排序

并发编程模型的分类

Happens-before

重排序

as-if-serial语义: 不管怎么重排序,程序的执行结果不能被改变(单线程)

程序顺序规则

顺序一致性

数据竞争与顺序一致性

顺序一致性内存模型

同步程序的顺序一致性

未同步程序的执行特性

volatile内存语义

volatile特性

volatile写-读建立 的happens-before关系

volatile 写-读的内存语义

volatile内存语义的实现

锁的内存语义

锁的释放-获取建立的happens-before关系

锁的释放-获取的内存语义

锁内存语义的实现

concurrent包的实现

final域的内存语义

Happens-before

JMM设计

happens-before的定义

happens-before规则

延迟初始化降低初始化类和创建对象的开销

双重检查锁定

基于volatile的解决方案

基于类初始化的解决方案

三、Java并发编程基础

线程

线程的6种状态

Daemon线程

启动或终止线程

线程间通信

volatile和sychronized关键字

等待、通知机制

等待、通知的经典范式

管道输入、输出流

Thread.join()

ThreadLocal

线程应用实例

等待超时模式

一个简单的数据库连接池示例

线程池技术

基于线程池技术的简单web服务器

四、Java中的锁

Lock接口

Lock接口与Synchronized的区别

队列同步器

队列同步器的接口

队列同步器的实现分析

同步队列

独占式同步状态获取的释放

共享式同步状态的获取与释放

独占式超时获取同步状态

重入锁

读写锁

读写锁接口

读写锁的实现分析

读锁的获取与释放

写锁的获取与释放

锁降级

LockSupport工具

Condition工具

Condition接口

Condition的实现分析

等待队列

等待

通知

五、Java并发容器和框架

ConcurrentHashMap

为什么要使用ConcurrentHashMap?

ConcurrentHashMap的结构

ConcurrentHashMap的初始化

定位Segment

ConcurrentHashMap的操作

ConcurrentLinkedQueue

ConcurrentLinkedQueue的结构

入队列

出队列

Java的中的阻塞队列

什么是阻塞队列?

Java里的阻塞队列

阻塞队列的实现原理

Fork/Join框架

什么是Fork/Join框架

工作窃取算法

Fork/Join框架的设计

使用Fork/Join框架

Fork/Join框架的异常处理

Fork/Join的实现原理

六、Java中的13个原子操作类

原子更新基本类型类

原子更新数组

AtomicIntegerArray: 将当前数组复制一份

原子更新引用类型

原子更新字段类

AtomicStampedReference: 原子更新带有版本号的引用类型. 该类将版本号与引用关联起来,可以解决使用CAS进行原子更新时的出现ABA问题

Atomic包一共提供13个类, 基本都是使用Unsafe实现的包装类

七、Java中的并发工具类

CountDownLatch

允许一个或多个线程等待其他线程完成操作

CycliBarrier

让一组线程到达屏障时被阻塞, 直到最后一个线程到达屏障时,屏障才会打开, 所有被屏障拦截的线程才会继续运行

Semaphore

用来控制同时访问特定资源的线程数量, 它通过协调各个线程,以保证合理的使用公共资源

Exchanger

进行线程间的数据交换

CountDownLatch的计数器只能使用一次,不可以被重置, CycliBarrier的计数器可以被重置

八、Executor框架

Executor介绍

Executor框架的两级调度模型

Executor框架的结构和成员

ThreadPoolExecutor

FixedThreadPool

SingleThreadExecutor

CacedThreadPool

ScheduledThredPoolExecutor

ScheduledThredPoolExecutor运行机制

ScheduledThredPoolExecutor实现

FutureTask

FutureTask处理实现Future接口外, 还实现了Runnable接口

FutureTask交给Executor执行, 也可以通过ExecutorService.submit() 或者单独使用FutureTask

FutureTask基于AQS

九、Java并发编程实践

生产者和消费者模式

线上问题定位

top、jstat

jstack 来 dump线程

性能测试

异步线程池

十、Java中的线程池

线程池的实现原理

线程池的使用

线程池的创建

corePoolSize

WorkerQueue

maximumPoolSize

ThreadFacotry

RejectedExecutionHandler

KeepAliveTime

TimeUnit

向线程池提交任务

execute(): 用于提交不需要返回值的任务

submit(): 用于提交需要返回值的任务

关闭线程池

shutdown

ShutdownNow

合理配置线程池

线程池的监控

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值