Java并发-草稿图
2024-11-17 08:50:00 0 举报
"Java并发-草稿图"是一个展示Java并发编程核心概念的图表,包括线程、锁、同步、异步、线程池等关键要素。这张图以一种直观、易懂的方式介绍了Java并发编程的基本原理和应用场景,对于Java开发人员了解并发编程非常有帮助。该图是一个PDF格式的文件,其中包含了丰富的色彩和图形,使得阅读和理解变得更加容易。
作者其他创作
大纲/内容
进入slow_case
TS_Waitt3
CPU-1
线程虚拟机栈
缓存
虚表内存地址
方法Y
当前CPU
lock_method代码__ movptr(xxxx)
操作系统线程
found = 0
....
5.当前线程抢占偏向锁CAS
java vtable
Node2
缓存(锁住)
update_ heuristics
wait()notify()notifyAll()
如果是
curNodelocked=true
lock record
撤销为无锁try_revoke_bias
访问这个区域触发的段错误
_WaitSet尾插法默认是移动到cxq队列中获取调度
Dead
pthread_mutex_lock()
pthread_wrlock_rdlock()
pthread_rwlock_wrlock()
线程状态转换图
就绪
副本found = 1
BasicLock.display_header
C++ vtable
CPU
1.自动识别锁对象:this、 Class对象
运行结束或异常退出
方法X
副本found = 0
TS_CXQt4
Klass对象占0x1b8个字节
CLHNode3
isLocked= trueCLHNode preNode = CLHNode2
while(preNode.isLocked) {}
t3
8M
Java内置的管程模型synchronized
条件变量A
等待锁
CPU-N
sleep()结束
pthread_join()中断
IO完成
工作内存
3.slow_case
默认不走
Java的Thread对象
条件变量等待队列
调度
TS_Waitt2
new
内存
Java对象的内存地址
revoke_bias
ThreadA
ThreadC
3.调用interp_masm_ppc_64.cpp#lock object
共享变量
调用test
获取了CPU
MCSNode1
isLocked= trueMCSNode next = MCSNode2
CLHNode2
isLocked= trueCLHNode preNode = CLHNode1
t2
获得锁
不相等
运行test函数需要的内存
PreNode
入口等待队列
Blocked
NULL
是
CPU-2
ThreadB
Node3
多个线程试图进入时排队,只允许一个线程进入,其他线程等待
lock_method
等待Blocked
恢复成无锁
如果不是
锁定Blocked
头部
等待锁的线程
UseHeavyMonitors
入口
_cxq头插法
biased_locking_enter
JVM的JavaThread对象
1.偏向锁逻辑
CLHNode1
isLocked= trueCLHNode preNode = CLHNode0
MCSNode3
CMSNode tail = MCSNode3
ThreadD
内存、IO等
0xbb 0x12 .....
Node1
TS_CXQt3
运行
4.done
存储执行流
CPU模块1
执行InterpreterRuntime::monitorenter
Running
t1线程
Tail
条件变量和等待队列的作用:解决线程同步的问题
monitorenter
curNode
MCSNode0
isLocked= falseMCSNode next = null
preNode
tailNode
等待某事件
yellow zone
preNodelocked=false
共享变量V
C++对象
lock object
地址总线
4.klass.epoch == oop.mark.epoch
0xbb 0x12 ....
阻塞
1.判断尾三位是不是101
抢锁失败
执行临界区代码
2.在堆中创建lock record将oop内存地址写入
最终做的事情
JMM
执行完
TS_CXQt2
父类虚函数一
父类虚函数二
父类虚函数N
本类虚函数一
本类虚函数N
isLocked= trueMCSNode preNode = MCSNode2
while(isLocked) {}
red zone
条件变量B
JVM的OSThread对象
线程
自旋等待
CLHNode0
isLocked= falseCLHNode preNode = null
不是
pthread_create()
templateInterpreter_x86_64.cpp#lock_method
sleep()pthread_join()
3.判断还是不是偏向锁
pthread_cond_signal()
pthread_cond_broadcast()
threadB
Node4
CPU模块2
主内存-方法区
+0x1b8指向klass对象的尾部
锁分配顺序
Runnable
MESA管程模型
已释放锁的线程
JVM做的封装。程序跑到red zone线程直接挂掉了,如果是yellow zone则会进行捕获
2.判断当前线程是否持有锁
pthread_cond_wait()
sync修饰代码块
sync修饰方法
CLHLock
CLHNode tail = CLHNode3
MCSNode2
isLocked= trueMCSNode next = MCSNode3
抢锁成功
之前已经触发了重偏向逻辑,进入重偏向逻辑try_bias
2.轻量级锁逻辑
当前拥有锁的线程,已结束自旋
threadA
事件发生
0 条评论
下一页