1. 并发问题调试
1. 使用jstack 命令 查看dump文件。
2. 多使用Java并发类库.
2. Java并发机制的底层实现原理
1. Volatile
在JIT编译器编译后对volatile关键字的变量增加lock前缀。
多核处理器对该前缀实现:
1. 将当前处理器缓存行的数据写回到系统内存。
2. 内存写回操作会使得在其他CPU里缓存了该内存的地址无效。
Cpu:使用内存屏障实现
2. Synchronized
JVM基于进入和退出Monitor对象来实现同步。代码块同步使用monitorenter 和 monitorexit指令实现。
a. 使用对象头存储锁。
b. 锁分状态:无锁状态,偏向锁,轻量级锁,重量级锁等。
c. 除了偏向锁,都使用CAS操作循环获取锁。
c. 原子操作的实现原理
a. CAS compare And Swap
b. 处理器使用总线加锁保证原子性
c. 处理器使用缓存锁定保证原子性
c. Java内存模型
1. 并发编程模型线程间通讯使用:
a. 共享变量(Java采用)。
b. 消息传递。
2. 重排序导致了内存可见性问题。
a. 编译器->
b. 指令级并行->
c. 内存系统重排序。
3. 内存屏障 StoreLoad Barriers
4. as-if-serial语义
a. 不管怎么重排序,单线程程序执行的结果不变,包括编译器,runtime,处理器都遵循该语义。
5. Final的语义
a. 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
b. 初次读一个包含final域的对象的引用,与随后初次读这个final域,这连个操作不能重排序。
6. Happen-before规则
a. …(自行查资料)
7.
8.
4. Java并发编程基础
1. 一个进程里面可以创建多个线程,这些线程都拥有各自的计数器,堆栈,和局部变量等。
a. 运行main线程产生的线程。
[5] Attach Listener //用户线程
[4] Signal Dispatcher //分发处理发送给JVM信号的线程
[3] Finalizer //调用对象finaliza方法的线程
[2] Reference Handler //清除reference的线程
[1] main //用户程序入口。
2. 更多的处理器核心,更快的响应时间,更好的编程模型。
对于某些简单的场景下,单纯讲运行速度是单线程更快,多线程处理的是高并发环境下,获得更好的总体性能。
2. 线程的状态
3. 终止线程:中断,volatile的Boolean变量。
4. 线程间通讯:volatile synchronize wait() notify notifyAll
5. 线程池的本质就是使用一个线程安全的队列连接工作者线程和消费者线程。
5.
6.
7.
8.