并发编程的艺术
并发编程的挑战
上下文切换
死锁
java并发底层原理
volatile
1 | 修改变量后,其他线程里面可见 |
synchronized
1 | 对象头 |
锁定升级
1 | 偏向锁(可关闭) |
原子操作的实现原理
1 | cpu术语定义 |
1 | cas的问题 |
内存模型
内存模型的基础
1 | 并发编程的两个关键问题:线程之间如何通信和线程之间如何同步. |
1 | 主内存 |
重排序
1 | 1,编译器优化的重排序 |
happens before
1 | 程序顺序规则:一个线程前边代码比之后的先执行 |
双重检查
1 | 重排序 |
java并发编程基础
线程
1 | 线程优先级 |
锁
1 | Lock |
并发容器
concurrenthashmap
1 | jdk8 |
concurrentlinkedqueue
1 | 线程一个线程安全的队列有两种方式:一种是使用阻塞算法,另一种是使用非阻塞算法算法. |
阻塞队列
1 | 阻塞队列是一个支持两个附加操作的队列. |
1 | ArrayBlockingQueue |
原子操作类
1 | 原子基本类型 |
并发工具类
1 | CountDownLatch |
线程池
1 | min |
1 | 调用方法比较 |
1 | 关闭 |
1 | 合理配置线程池 |
1 | 线程池监控 |
executor框架
1 | ThreadPoolExecutor |
lock/synchronize区别
1 | http://www.manongjc.com/article/47515.html |
序号 | lock | synchronize |
---|---|---|
所处层面 | java接口 | java关键字 entry set(acquire)/wait set(release) |
获锁方式 | 使用aqs,加锁当前线程,原子类统计加锁次数 | 实例方法/静态方法/代码块 获取监视器 |
获锁失败 | 加入aqs等待自旋,然后阻塞 | 加入虚拟等待队列中阻塞直到释放 |
偏向/重入 | 重入,原子数量变化 | 偏向,获取锁厚,再次不需要获取锁 |
lock独有队列 | 特有condition队列 | |
解锁操作 | 使用unlock | 自动解锁 |
并发demo
1 | 并发的问题 |
1 | public class Printer{ |