jvm多线程底层执行流程分析
内容参考: https://www.cnblogs.com/dennyzhangdd/p/6734638.html
1.对于刚开始不支持原语操作的硬件来说,多线程的执行是以开关中断来实现的。但是对于支持原语操作的硬件,比如在x86 平台上,CPU提供了在指令执行期间对总线加锁的手段。CPU芯片上有一条引线#HLOCK pin,如果汇编语言的程序中在一条指令前面加上前缀"LOCK",经过汇编以后的机器代码就使CPU在执行这条指令的时候把#HLOCK pin的电位拉低,持续到这条指令结束时放开,从而把总线锁住,这样同一总线上别的CPU就暂时不能通过总线访问内存了,保证了这条指令在多处理器环境中的原子性。
%ifdef _X_UP_
%define _X_LOCK_
%else
%define _X_LOCK_ lock
%endif
@[email protected]:
mov eax , 1
_X_LOCK_ inc DWORD [ecx+0]
jnz short @[email protected]
xor eax , eax
@[email protected]:
ret
@[email protected]:
mov eax , 1
_X_LOCK_ dec DWORD [ecx+0]
jnz short @[email protected]
xor eax , eax
@[email protected]:
ret
@[email protected]:
mov eax , [esp+4]
_X_LOCK_ cmpxchg [ecx],edx
mov eax , 1
jz short @[email protected]
xor eax , eax
@[email protected]:
ret 4
@[email protected]:
push ebx
push ebp
mov ebp , ecx
mov ecx , [edx+4]
mov ebx , [edx+0]
mov edx , [esp+12]
mov eax , [edx+0]
mov edx , [edx+4]
_X_LOCK_ cmpxchg8b [ebp]
mov eax , 1
jz short @[email protected]
xor eax , eax
@[email protected]:
pop ebp
pop ebx
ret 4
2.下图是Java多线程的底层执行