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

@_XPEER2_atomic_incl@4:
    mov eax , 1
    _X_LOCK_ inc DWORD [ecx+0] 
    jnz short @inclOK@
    xor eax , eax
@inclOK@:
    ret

@_XPEER2_atomic_decl@4:
    mov eax , 1
    _X_LOCK_ dec DWORD [ecx+0] 
    jnz short @declOK@
    xor eax , eax
@declOK@:
    ret    

@_XPEER2_atomic_CAS@12:
    mov eax , [esp+4]
    _X_LOCK_ cmpxchg [ecx],edx
    mov eax , 1
    jz short @CASDone@
    xor eax , eax
@CASDone@:
    ret 4

@_XPEER2_atomic_CAS2@12:
    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 @CAS2Done@
    xor  eax , eax 
@CAS2Done@:
    pop  ebp
    pop  ebx
    ret 4    

2.下图是Java多线程的底层执行

猜你喜欢

转载自blog.csdn.net/Jbinbin/article/details/82259327
今日推荐