Java并发编程深度解析与实战

购买链接

(同步博客)并发
2023-02-25 周六

20.33 24页。interrupt
21.10 38页。第一章完。

总结一下

.java运行到系统。

磁盘IO慢,cpu运算快。
cpu等IO返回一直闲置,cpu计算机核心资源,被闲置不合理。

充分利用,分时系统诞生!
多道程序,cpu时间片调度(多用户用一台计算机)
单进程不能使计算机一直忙碌,多进程加载进内场,独立互不干扰。

系统运行指令序列是程序,运行中程序是进程。
进程可能一段阻塞导致另外一段不能运行。

线程诞生,进程是资源,线程是cpu调度。

线程的状态图 彻底全部看懂了。
time_wait 和 wait区别与时间等待。

中断会set true,内存屏障fence
中断变量 volatile,
unpark,最后调用 java_thread 中断事件(中断异常)
(异常清除标志位,仅为了自己选择是否退出)

守护线程
main线程,以及 正常创建的线程 默认是用户线程,
(1个用户线程在,jvm不会退出,)
jvm退出可以设置钩子 runtime.hook
gc线程是守护线程
(没有用户线程,就没有垃圾,jvm结束)
包括:心跳检测,…

jstack pid 打印线程(状态,堆栈信息)

2023-02-25 周六
22.53 50页
互斥两个条件:
1 同一资源;(对象)
2 标记空闲/繁忙;(对象头)

53页 jol-core

23.35 55页 对象填充(空间换时间)
cpu读内存不是bit 也不是字节,而是字长。
64位字长64位。也就是8字节。
未填充,跨字长读取要读取两次内存,再寄存器拼接。

instanceOop.hpp instanceOopDesc
arrayOop.hpp instanceOopDesc
oop.hpp oopDesc
oopsHierarchy.hpp typedef markOop
markOop.hpp markOopDesc 注释存储布局
lock_bits=2
biased_lock_bits=1

1.6前,sync只有重量锁。线程未获得锁调用park阻塞,接着被获得锁的线程唤醒后再次抢占锁,直到抢占成功。

重量级锁调用操作系统 Mutex Lock,当前线程挂起,并从用户态切换到内核态来执行,这种切换带来的性能开销是非常大的。

权衡 性能和线程安全,1.6后,增加偏向锁和轻量级锁,不阻塞达到线程安全。
(看到了60页,真快)


2023-02-26 周日 22.10开始,

23.23 68页
无锁 001,偏向101,轻量000,重量010。

偏向cas一次(偏向默认4s延迟),
轻量自旋,默认10次,
重量 mutex lock


2023-02-27 周一
07.51 79页 偏向锁具体实现流程


2023-02-28 周二
06.04开始,
07.50 88页 重量级锁实现(看完了)


2023-03-01 周三
06.40 开始,
06.55 96页结束。

第三章 volatile
08.09 113页 高速缓存,总线锁 缓存锁MESI协议。


2023-03-02 周四
08.03 117页 指令重排序,as-if-serial 程序重排序。


2023-03-03 周五 06.46 开始,
08.05 129页。

在这里插入图片描述


2023-03-04 周六 06.24开始,
142页完 volatile 可见性完。
volatile java-v 有 ACC_VALATITLE
字节码解释器执行,定位 bytecodeInterpreter.cpp,
静态变量 getstatic/putstatic,
非静态变量 getfield/putfield
is_volatile 后面加storeload();
volatile C++ volatile 禁止 JIT指令重排序。
volatile赋值的字段,JVM会调用 storeload()内存屏障,该方法中有lock指令。
1,变量放buffer,lock指令:buffer -> cache
2,让其他cpu cache失效(invid Q立即生效)

synchronized 为什么可见性,因为它 happens-before原则。

2023-03-06 周一 06.00开始,
166页 结束 08.01 周一,
(尝试获取锁/可重入锁,入队park,解锁unpark,)


2023-03-07 周二 06.06开始,
08.00 180页(读写锁,好困)


2023-03-10 周五 05.45开始,
187页 07.02(第四章完 可重复锁,读写锁,时间戳锁)
195页 08.16 wait/notify


2023-03-11 周六
22.53 203页。join,Condition。


2023-03-12 周日 17.58
18.52 213页await,signal源码。(第五章完)
244页 (第六章完 CD S CB)
270页 ThreadLocal,ForkJoin


2023-03-15 周三 07.31
08.26 286页(fork join 原理,源码)


2023-03-16 周四 07.26
07.38 293页 fork join 案例(第七章完)
08.26 315页 阻塞队列(有界无界,add remove element,offer poll peek,put take,offer poll 超时)


2023-03-18 周六 14.18
14.46 326页 第八章完
22.57 365页(concurrenthashmap 添加/扩容/大小)


2023-03-19 周日
22.36 373页(红黑树 插入)


2023-03-21 周二 06.57
07.58 388页(红黑树 插入/删除 treeifyBin)


2023-03-23 周四 07.10
07.40 394页(第九章完 head/tail跳跃cas更新 跳表)
08.07 408页 线程池


2023-03-24 周五 06.37
07.34 425页 线程池源码execute
addWorker 1不创建 2更新Worker数量 3创建并启动
worker runnable AQS
runWorker(getTask interrupt run processWorkerExit)
getTask(获取任务 返回null)
processWorkerExit(创建max线程 无任务)
(1任务异常 2小于核心 3Q有但core无)
拒绝策略
1 抛异常
2 非shutdown run当前
3 无处理
4 非shutdown Q弹一个,execute当前

20.58~21.29 425~442页 (第10章完)
线程池大小设置,动态扩容,endpoint健康,

22.52 473页 FutureTask实现/CompletableFuture 方法

2023-03-25 周六
10.43 P454~P470 梳理CompletableFuture方法。
11.46 491页(第11章结束 本书完)
CompletableFuture源码分析(一点印象)


总耗时一个月整!