汇编代码-证明synchronized同步函数锁住的对象是this?

Synchronized

  • 作用范围
    1.作用于方法时,锁住的是对象的实例(this);
    2.当作用于静态方法时,锁住的是Class实例,又因为Class的相关数据存储在永久带PermGen (jdk1.8 则是 metaspace),永久带是全局共享的,因此静态方法锁相当于类的一个全局锁, 会锁所有调用该方法的线程;
    3.synchronized 作用于一个对象实例时,锁住的是所有以该对象为锁的代码块。它有多个队列, 当多个线程一起访问某个对象监视器的时候,对象监视器会将这些线程存储在不同的容器中。
    Synchronized

关于证明,网上的方法,然我不敢苟同,网上大多是采用:
同步代码块,和同步函数对比的办法。采用打印来看结果,我认为,这是不对的。我今天是在伟大的B站上看的视频,然后一搜,网上竟然都是这种方法。这明显是不能证明的😂
下面我仅给出一段代码,大家细品:

    /**
     * Prints a String and then terminate the line.  This method behaves as
     * though it invokes <code>{@link #print(String)}</code> and then
     * <code>{@link #println()}</code>.
     *
     * @param x  The <code>String</code> to be printed.
     */
    public void println(String x) {
        synchronized (this) {
            print(x);
            newLine();
        }
    }

所以,同步函数里面用着System.out.println()来打印看结果,你还怎么证明它同步函数是锁的this?

细看,emmm…看了同款视频,出自同一个老师,卖票,懂的都懂😂

 public synchronized void sale(){

        if(countTicket>0){
            //卖票
            System.out.println("当前线程名字:"+Thread.currentThread().getName()+";出售第"+(100 - countTicket + 1)+"张票。");
            countTicket--;
        }

    }

那问题来了,我们怎么证明?
我的概念里,javap 命令,是打印class加载时的上下文信息的,而java的对象,是运行的时候的一个东西,我们得打印运行时候的汇编代码。

这里之前,收藏了一种方法:
使用hsdis-amd64.dll打印java的汇编文件
放到 jre的bin目录下面,配合一个VM的命令,就可以
看java程序执行过程中,具体汇编执行代码

文件放在\jre\bin目录下

hsdis-amd64.dll 下载路径:https://github.com/atzhangsan/file_loaded

启动参数:

-server -Xcomp -XX:+UnlockDiagnosticVMOptions -XX:+PrintAssembly -XX:CompileCommand=compileonly,*Bar.sum

Bar.sum换成 具体类.方法名
(链接是之前一篇博客里看到的,感激ing)

下面开始证明:


java代码:

package com.gao.concurrentAnt.ticketDemo;

/**
 * TODO
 *
 * @author Adward
 * @version 1.0
 * @date 2020/10/31 16:22
 */
public class TicketDemo03 {
    public static void main(String[] args) {
        int ticketBalance = 100;

        GetTicket03 t1 = new GetTicket03(ticketBalance);


        Thread th1 = new Thread(t1, "线程1");
        Thread th2 = new Thread(t1, "线程2");

        th1.start();
        th2.start();

    }
}


class GetTicket03 extends Thread {

    private int ticketn;
    private Object obj=new Object();


    public GetTicket03(int ticketn) {
        this.ticketn = ticketn;
    }


    @Override
    public void run() {
        //2.加在方法上
           buy();
    }

    private synchronized void buy() {
        while (ticketn > 0) {
           // System.out.println(Thread.currentThread().getName() + "抢到票了" + "票编号" + ticketn + "第" + (100 - ticketn + 1) + "张");
            ticketn--;
        }
    }
}

我们只是操作并没有System.out.println的打印等,我们只是静静看它汇编代码打印出来,这里事先说明,我也不清楚他这个打印,会不会有synchronized(this)的问题,
下面式结果:


CompilerOracle: compileonly *GetTicket03.buy
Loaded disassembler from D:\MyWorkHome\Apps\Machines\jdk\jdk1.8.0_201\jre\bin\server\hsdis-amd64.dll
Decoding compiled method 0x0000000002ac5310:
Code:
Argument 0 is unknown.RIP: 0x2ac5480 Code size: 0x00000370
[Disassembling for mach='amd64']
[Entry Point]
[Constants]
  # {method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03'
  #           [sp+0x50]  (sp of caller)
  0x0000000002ac5480: mov     r10d,dword ptr [rdx+8h]
  0x0000000002ac5484: shl     r10,3h
  0x0000000002ac5488: cmp     r10,rax
  0x0000000002ac548b: jne     2a05f60h          ;   {runtime_call}
  0x0000000002ac5491: nop     word ptr [rax+rax+0h]
  0x0000000002ac549c: nop
[Verified Entry Point]
  0x0000000002ac54a0: mov     dword ptr [rsp+0ffffffffffffa000h],eax
  0x0000000002ac54a7: push    rbp
  0x0000000002ac54a8: sub     rsp,40h
  0x0000000002ac54ac: lea     rsi,[rsp+20h]
  0x0000000002ac54b1: mov     qword ptr [rsi+8h],rdx
  0x0000000002ac54b5: mov     rax,qword ptr [rdx]
  0x0000000002ac54b8: mov     rdi,rax
  0x0000000002ac54bb: and     rdi,7h
  0x0000000002ac54bf: cmp     rdi,5h
  0x0000000002ac54c3: jne     2ac554ah
  0x0000000002ac54c9: mov     edi,dword ptr [rdx+8h]
  0x0000000002ac54cc: shl     rdi,3h
  0x0000000002ac54d0: mov     rdi,qword ptr [rdi+0a8h]
  0x0000000002ac54d7: or      rdi,r15
  0x0000000002ac54da: xor     rdi,rax
  0x0000000002ac54dd: and     rdi,0ffffffffffffff87h
  0x0000000002ac54e1: je      2ac5572h
  0x0000000002ac54e7: test    rdi,7h
  0x0000000002ac54ee: jne     2ac5537h
  0x0000000002ac54f0: test    rdi,300h
  0x0000000002ac54f7: jne     2ac5516h
  0x0000000002ac54f9: and     rax,37fh
  0x0000000002ac5500: mov     rdi,rax
  0x0000000002ac5503: or      rdi,r15
  0x0000000002ac5506: lock cmpxchg qword ptr [rdx],rdi
  0x0000000002ac550b: jne     2ac5674h
  0x0000000002ac5511: jmp     2ac5572h
  0x0000000002ac5516: mov     edi,dword ptr [rdx+8h]
  0x0000000002ac5519: shl     rdi,3h
  0x0000000002ac551d: mov     rdi,qword ptr [rdi+0a8h]
  0x0000000002ac5524: or      rdi,r15
  0x0000000002ac5527: lock cmpxchg qword ptr [rdx],rdi
  0x0000000002ac552c: jne     2ac5674h
  0x0000000002ac5532: jmp     2ac5572h
  0x0000000002ac5537: mov     edi,dword ptr [rdx+8h]
  0x0000000002ac553a: shl     rdi,3h
  0x0000000002ac553e: mov     rdi,qword ptr [rdi+0a8h]
  0x0000000002ac5545: lock cmpxchg qword ptr [rdx],rdi
  0x0000000002ac554a: mov     rax,qword ptr [rdx]
  0x0000000002ac554d: or      rax,1h
  0x0000000002ac5551: mov     qword ptr [rsi],rax
  0x0000000002ac5554: lock cmpxchg qword ptr [rdx],rsi
  0x0000000002ac5559: je      2ac5572h
  0x0000000002ac555f: sub     rax,rsp
  0x0000000002ac5562: and     rax,0fffffffffffff007h
  0x0000000002ac5569: mov     qword ptr [rsi],rax
  0x0000000002ac556c: jne     2ac5674h
  0x0000000002ac5572: mov     rax,1bdf31a8h     ;   {metadata(method data for {method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac557c: mov     esi,dword ptr [rax+0dch]
  0x0000000002ac5582: add     esi,8h
  0x0000000002ac5585: mov     dword ptr [rax+0dch],esi
  0x0000000002ac558b: mov     rax,1bdf3028h     ;   {metadata({method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac5595: and     esi,0h
  0x0000000002ac5598: cmp     esi,0h
  0x0000000002ac559b: je      2ac5687h
  0x0000000002ac55a1: jmp     2ac55f8h          ;*aload_0
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@0 (line 45)

  0x0000000002ac55a6: nop
  0x0000000002ac55a8: dec     eax
  0x0000000002ac55aa: mov     dword ptr [rdx+178h],eax
                                                ;*putfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@14 (line 47)

  0x0000000002ac55b0: mov     rax,1bdf31a8h     ;   {metadata(method data for {method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac55ba: mov     esi,dword ptr [rax+0e0h]
  0x0000000002ac55c0: add     esi,8h
  0x0000000002ac55c3: mov     dword ptr [rax+0e0h],esi
  0x0000000002ac55c9: mov     rax,1bdf3028h     ;   {metadata({method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac55d3: and     esi,0fff8h
  0x0000000002ac55d9: cmp     esi,0h
  0x0000000002ac55dc: je      2ac569eh          ; OopMap{rdx=Oop [40]=Oop off=354}
                                                ;*goto
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@17 (line 47)

  0x0000000002ac55e2: test    dword ptr [0a60100h],eax
                                                ;   {poll}
  0x0000000002ac55e8: mov     rax,1bdf31a8h     ;   {metadata(method data for {method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac55f2: inc     dword ptr [rax+128h]  ;*goto
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@17 (line 47)

  0x0000000002ac55f8: mov     eax,dword ptr [rdx+178h]
                                                ;*getfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@1 (line 45)

  0x0000000002ac55fe: cmp     eax,0h
  0x0000000002ac5601: mov     rsi,1bdf31a8h     ;   {metadata(method data for {method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac560b: mov     rdi,108h
  0x0000000002ac5615: jle     2ac5625h
  0x0000000002ac561b: mov     rdi,118h
  0x0000000002ac5625: mov     rbx,qword ptr [rsi+rdi]
  0x0000000002ac5629: lea     rbx,[rbx+1h]
  0x0000000002ac562d: mov     qword ptr [rsi+rdi],rbx
  0x0000000002ac5631: jnle    2ac55a8h          ;*ifle
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@4 (line 45)

  0x0000000002ac5637: lea     rax,[rsp+20h]
  0x0000000002ac563c: mov     rdi,qword ptr [rax+8h]
  0x0000000002ac5640: mov     rsi,qword ptr [rdi]
  0x0000000002ac5643: and     rsi,7h
  0x0000000002ac5647: cmp     rsi,5h
  0x0000000002ac564b: je      2ac5668h
  0x0000000002ac5651: mov     rsi,qword ptr [rax]
  0x0000000002ac5654: test    rsi,rsi
  0x0000000002ac5657: je      2ac5668h
  0x0000000002ac565d: lock cmpxchg qword ptr [rdi],rsi
  0x0000000002ac5662: jne     2ac56b5h          ;*return
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@20 (line 49)

  0x0000000002ac5668: add     rsp,40h
  0x0000000002ac566c: pop     rbp
  0x0000000002ac566d: test    dword ptr [0a60100h],eax
                                                ;   {poll_return}
  0x0000000002ac5673: ret
  0x0000000002ac5674: mov     qword ptr [rsp+8h],rdx
  0x0000000002ac5679: mov     qword ptr [rsp],rsi
  0x0000000002ac567d: call    2abf060h          ; OopMap{rdx=Oop [40]=Oop off=514}
                                                ;*synchronization entry
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@-1 (line 45)
                                                ;   {runtime_call}
  0x0000000002ac5682: jmp     2ac5572h
  0x0000000002ac5687: mov     qword ptr [rsp+8h],rax
  0x0000000002ac568c: mov     qword ptr [rsp],0ffffffffffffffffh
  0x0000000002ac5694: call    2ac0f60h          ; OopMap{rdx=Oop [40]=Oop off=537}
                                                ;*synchronization entry
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@-1 (line 45)
                                                ;   {runtime_call}
  0x0000000002ac5699: jmp     2ac55a1h
  0x0000000002ac569e: mov     qword ptr [rsp+8h],rax
  0x0000000002ac56a3: mov     qword ptr [rsp],11h
  0x0000000002ac56ab: call    2ac0f60h          ; OopMap{rdx=Oop [40]=Oop off=560}
                                                ;*goto
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@17 (line 47)
                                                ;   {runtime_call}
  0x0000000002ac56b0: jmp     2ac55e2h
  0x0000000002ac56b5: lea     rax,[rsp+20h]
  0x0000000002ac56ba: mov     qword ptr [rsp],rax
  0x0000000002ac56be: call    2abf4a0h          ;   {runtime_call}
  0x0000000002ac56c3: jmp     2ac5668h
  0x0000000002ac56c5: nop
  0x0000000002ac56c6: nop
  0x0000000002ac56c7: mov     rax,qword ptr [r15+2a8h]
  0x0000000002ac56ce: mov     r10,0h
  0x0000000002ac56d8: mov     qword ptr [r15+2a8h],r10
  0x0000000002ac56df: mov     r10,0h
  0x0000000002ac56e9: mov     qword ptr [r15+2b0h],r10
  0x0000000002ac56f0: mov     rbx,rax
  0x0000000002ac56f3: lea     rax,[rsp+20h]
  0x0000000002ac56f8: mov     rsi,qword ptr [rax+8h]
  0x0000000002ac56fc: mov     rdi,qword ptr [rsi]
  0x0000000002ac56ff: and     rdi,7h
  0x0000000002ac5703: cmp     rdi,5h
  0x0000000002ac5707: je      2ac5724h
  0x0000000002ac570d: mov     rdi,qword ptr [rax]
  0x0000000002ac5710: test    rdi,rdi
  0x0000000002ac5713: je      2ac5724h
  0x0000000002ac5719: lock cmpxchg qword ptr [rsi],rdi
  0x0000000002ac571e: jne     2ac5731h
  0x0000000002ac5724: mov     rax,rbx
  0x0000000002ac5727: add     rsp,40h
  0x0000000002ac572b: pop     rbp
  0x0000000002ac572c: jmp     2a2efa0h          ;   {runtime_call}
  0x0000000002ac5731: lea     rax,[rsp+20h]
  0x0000000002ac5736: mov     qword ptr [rsp],rax
  0x0000000002ac573a: call    2abf4a0h          ;   {runtime_call}
  0x0000000002ac573f: jmp     2ac5724h
  0x0000000002ac5741: hlt
  0x0000000002ac5742: hlt
  0x0000000002ac5743: hlt
  0x0000000002ac5744: hlt
  0x0000000002ac5745: hlt
  0x0000000002ac5746: hlt
  0x0000000002ac5747: hlt
  0x0000000002ac5748: hlt
  0x0000000002ac5749: hlt
  0x0000000002ac574a: hlt
  0x0000000002ac574b: hlt
  0x0000000002ac574c: hlt
  0x0000000002ac574d: hlt
  0x0000000002ac574e: hlt
  0x0000000002ac574f: hlt
  0x0000000002ac5750: hlt
  0x0000000002ac5751: hlt
  0x0000000002ac5752: hlt
  0x0000000002ac5753: hlt
  0x0000000002ac5754: hlt
  0x0000000002ac5755: hlt
  0x0000000002ac5756: hlt
  0x0000000002ac5757: hlt
  0x0000000002ac5758: hlt
  0x0000000002ac5759: hlt
  0x0000000002ac575a: hlt
  0x0000000002ac575b: hlt
  0x0000000002ac575c: hlt
  0x0000000002ac575d: hlt
  0x0000000002ac575e: hlt
  0x0000000002ac575f: hlt
[Exception Handler]
[Stub Code]
  0x0000000002ac5760: call    2abe520h          ;   {no_reloc}
  0x0000000002ac5765: mov     qword ptr [rsp+0ffffffffffffffd8h],rsp
  0x0000000002ac576a: sub     rsp,80h
  0x0000000002ac5771: mov     qword ptr [rsp+78h],rax
  0x0000000002ac5776: mov     qword ptr [rsp+70h],rcx
  0x0000000002ac577b: mov     qword ptr [rsp+68h],rdx
  0x0000000002ac5780: mov     qword ptr [rsp+60h],rbx
  0x0000000002ac5785: mov     qword ptr [rsp+50h],rbp
  0x0000000002ac578a: mov     qword ptr [rsp+48h],rsi
  0x0000000002ac578f: mov     qword ptr [rsp+40h],rdi
  0x0000000002ac5794: mov     qword ptr [rsp+38h],r8
  0x0000000002ac5799: mov     qword ptr [rsp+30h],r9
  0x0000000002ac579e: mov     qword ptr [rsp+28h],r10
  0x0000000002ac57a3: mov     qword ptr [rsp+20h],r11
  0x0000000002ac57a8: mov     qword ptr [rsp+18h],r12
  0x0000000002ac57ad: mov     qword ptr [rsp+10h],r13
  0x0000000002ac57b2: mov     qword ptr [rsp+8h],r14
  0x0000000002ac57b7: mov     qword ptr [rsp],r15
  0x0000000002ac57bb: mov     rcx,5723f770h     ;   {external_word}
  0x0000000002ac57c5: mov     rdx,2ac5765h      ;   {internal_word}
  0x0000000002ac57cf: mov     r8,rsp
  0x0000000002ac57d2: and     rsp,0fffffffffffffff0h
  0x0000000002ac57d6: call    56ef6b80h         ;   {runtime_call}
  0x0000000002ac57db: hlt
[Deopt Handler Code]
  0x0000000002ac57dc: mov     r10,2ac57dch      ;   {section_word}
  0x0000000002ac57e6: push    r10
  0x0000000002ac57e8: jmp     2a07600h          ;   {runtime_call}
  0x0000000002ac57ed: hlt
  0x0000000002ac57ee: hlt
  0x0000000002ac57ef: hlt
Decoding compiled method 0x0000000002ac4910:
Code:
Argument 0 is unknown.RIP: 0x2ac4a40 Code size: 0x00000258
[Entry Point]
[Constants]
  # {method} {0x000000001bdf3030} 'buy' '()V' in 'com/gao/concurrentAnt/ticketDemo/GetTicket03'
  #           [sp+0x50]  (sp of caller)
  0x0000000002ac4a40: mov     r10d,dword ptr [rdx+8h]
  0x0000000002ac4a44: shl     r10,3h
  0x0000000002ac4a48: cmp     rax,r10
  0x0000000002ac4a4b: jne     2a05f60h          ;   {runtime_call}
  0x0000000002ac4a51: nop
  0x0000000002ac4a54: nop     dword ptr [rax+rax+0h]
  0x0000000002ac4a5c: nop
[Verified Entry Point]
  0x0000000002ac4a60: mov     dword ptr [rsp+0ffffffffffffa000h],eax
  0x0000000002ac4a67: push    rbp
  0x0000000002ac4a68: sub     rsp,40h
  0x0000000002ac4a6c: mov     rbp,rdx
  0x0000000002ac4a6f: mov     rax,qword ptr [rdx]
  0x0000000002ac4a72: mov     r10,rax
  0x0000000002ac4a75: and     r10,7h
  0x0000000002ac4a79: cmp     r10,5h
  0x0000000002ac4a7d: jne     2ac4b38h
  0x0000000002ac4a83: mov     r11d,0f800c143h   ;   {metadata('com/gao/concurrentAnt/ticketDemo/GetTicket03')}
  0x0000000002ac4a89: mov     r10,0h
  0x0000000002ac4a93: lea     r10,[r10+r11*8]
  0x0000000002ac4a97: mov     r10,qword ptr [r10+0a8h]
  0x0000000002ac4a9e: mov     r11,r10
  0x0000000002ac4aa1: or      r11,r15
  0x0000000002ac4aa4: mov     r8,r11
  0x0000000002ac4aa7: xor     r8,rax
  0x0000000002ac4aaa: test    r8,0ffffffffffffff87h
  0x0000000002ac4ab1: jne     2ac4c45h          ;*synchronization entry
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@-1 (line 45)

  0x0000000002ac4ab7: mov     r10d,dword ptr [rbp+178h]
                                                ;*getfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@1 (line 45)

  0x0000000002ac4abe: test    r10d,r10d
  0x0000000002ac4ac1: jle     2ac4b17h          ;*ifle
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@4 (line 45)

  0x0000000002ac4ac3: mov     r11d,r10d
  0x0000000002ac4ac6: dec     r11d
  0x0000000002ac4ac9: nop                       ;*aload_0
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@7 (line 47)

  0x0000000002ac4acc: dec     r10d              ;*isub
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@13 (line 47)

  0x0000000002ac4acf: mov     dword ptr [rbp+178h],r10d
                                                ;*putfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@14 (line 47)

  0x0000000002ac4ad6: cmp     r10d,r11d
  0x0000000002ac4ad9: jnle    2ac4acch          ;*ifle
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@4 (line 45)

  0x0000000002ac4adb: cmp     r10d,0fh
  0x0000000002ac4adf: jle     2ac4b00h          ;*aload_0
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@7 (line 47)

  0x0000000002ac4ae1: mov     r8d,r10d
  0x0000000002ac4ae4: add     r8d,0fffffff1h
  0x0000000002ac4ae8: mov     dword ptr [rbp+178h],r8d
                                                ;*putfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@14 (line 47)

  0x0000000002ac4aef: add     r10d,0fffffff0h   ;*isub
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@13 (line 47)

  0x0000000002ac4af3: mov     dword ptr [rbp+178h],r10d
                                                ;*putfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@14 (line 47)

  0x0000000002ac4afa: cmp     r10d,0fh
  0x0000000002ac4afe: jnle    2ac4ae1h          ;*ifle
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@4 (line 45)

  0x0000000002ac4b00: test    r10d,r10d
  0x0000000002ac4b03: jle     2ac4b17h
  0x0000000002ac4b05: nop                       ;*aload_0
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@7 (line 47)

  0x0000000002ac4b08: dec     r10d              ;*isub
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@13 (line 47)

  0x0000000002ac4b0b: mov     dword ptr [rbp+178h],r10d
                                                ;*putfield ticketn
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@14 (line 47)

  0x0000000002ac4b12: test    r10d,r10d
  0x0000000002ac4b15: jnle    2ac4b08h
  0x0000000002ac4b17: mov     r10d,7h
  0x0000000002ac4b1d: and     r10,qword ptr [rbp+0h]
  0x0000000002ac4b21: cmp     r10,5h
  0x0000000002ac4b25: jne     2ac4b9dh          ;*return
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@20 (line 49)

  0x0000000002ac4b27: add     rsp,40h
  0x0000000002ac4b2b: pop     rbp
  0x0000000002ac4b2c: test    dword ptr [0a60000h],eax
                                                ;   {poll_return}
  0x0000000002ac4b32: ret
  0x0000000002ac4b33: lock cmpxchg qword ptr [rdx],r10
  0x0000000002ac4b38: lea     rbx,[rsp+30h]
  0x0000000002ac4b3d: mov     rax,qword ptr [rdx]
  0x0000000002ac4b40: test    rax,2h
  0x0000000002ac4b46: jne     2ac4b6ch
  0x0000000002ac4b48: or      rax,1h
  0x0000000002ac4b4c: mov     qword ptr [rbx],rax
  0x0000000002ac4b4f: lock cmpxchg qword ptr [rdx],rbx
  0x0000000002ac4b54: je      2ac4b85h
  0x0000000002ac4b5a: sub     rax,rsp
  0x0000000002ac4b5d: and     rax,0fffffffffffff007h
  0x0000000002ac4b64: mov     qword ptr [rbx],rax
  0x0000000002ac4b67: jmp     2ac4b85h
  0x0000000002ac4b6c: mov     qword ptr [rbx],3h
  0x0000000002ac4b73: mov     rbx,rax
  0x0000000002ac4b76: mov     rax,qword ptr [rbx+16h]
  0x0000000002ac4b7a: test    rax,rax
  0x0000000002ac4b7d: jne     2ac4b85h
  0x0000000002ac4b7f: lock cmpxchg qword ptr [rbx+16h],r15
  0x0000000002ac4b85: je      2ac4ab7h
  0x0000000002ac4b8b: lea     r8,[rsp+30h]
  0x0000000002ac4b90: nop
  0x0000000002ac4b93: call    2ac17a0h          ; OopMap{rbp=Oop off=344}
                                                ;*synchronization entry
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@-1 (line 45)
                                                ;   {runtime_call}
  0x0000000002ac4b98: jmp     2ac4ab7h
  0x0000000002ac4b9d: lea     rax,[rsp+30h]
  0x0000000002ac4ba2: cmp     qword ptr [rax],0h
  0x0000000002ac4ba9: je      2ac4c25h
  0x0000000002ac4baf: mov     r10,qword ptr [rbp+0h]
  0x0000000002ac4bb3: test    r10,2h
  0x0000000002ac4bba: je      2ac4c1ch
  0x0000000002ac4bbc: mov     rax,qword ptr [r10+16h]
  0x0000000002ac4bc0: xor     rax,r15
  0x0000000002ac4bc3: or      rax,qword ptr [r10+26h]
  0x0000000002ac4bc7: jne     2ac4c25h
  0x0000000002ac4bc9: mov     rax,qword ptr [r10+36h]
  0x0000000002ac4bcd: or      rax,qword ptr [r10+3eh]
  0x0000000002ac4bd1: jne     2ac4bddh
  0x0000000002ac4bd3: mov     qword ptr [r10+16h],0h
  0x0000000002ac4bdb: jmp     2ac4c25h
  0x0000000002ac4bdd: cmp     qword ptr [r10+46h],0h
  0x0000000002ac4be5: je      2ac4c10h
  0x0000000002ac4be7: mov     qword ptr [r10+16h],0h
  0x0000000002ac4bef: lock add dword ptr [rsp],0h
  0x0000000002ac4bf4: cmp     qword ptr [r10+46h],0h
  0x0000000002ac4bfc: jne     2ac4c15h
  0x0000000002ac4bfe: mov     rax,0h
  0x0000000002ac4c08: lock cmpxchg qword ptr [r10+16h],r15
  0x0000000002ac4c0e: jne     2ac4c15h
  0x0000000002ac4c10: or      eax,1h
  0x0000000002ac4c13: jmp     2ac4c25h
  0x0000000002ac4c15: test    eax,0h
  0x0000000002ac4c1a: jmp     2ac4c25h
  0x0000000002ac4c1c: mov     r10,qword ptr [rax]
  0x0000000002ac4c1f: lock cmpxchg qword ptr [rbp+0h],r10
  0x0000000002ac4c25: je      2ac4b27h
  0x0000000002ac4c2b: mov     rcx,rbp
  0x0000000002ac4c2e: lea     rdx,[rsp+30h]     ;*synchronization entry
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@-1 (line 45)

  0x0000000002ac4c33: mov     r10,56e2dde0h
  0x0000000002ac4c3d: call indirect r10         ;*return
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@20 (line 49)

  0x0000000002ac4c40: jmp     2ac4b27h
  0x0000000002ac4c45: test    r8,7h
  0x0000000002ac4c4c: jne     2ac4b33h
  0x0000000002ac4c52: test    r8,300h
  0x0000000002ac4c59: jne     2ac4c68h
  0x0000000002ac4c5b: and     rax,37fh
  0x0000000002ac4c62: mov     r11,rax
  0x0000000002ac4c65: or      r11,r15
  0x0000000002ac4c68: lock cmpxchg qword ptr [rdx],r11
  0x0000000002ac4c6d: jne     2ac4b8bh
  0x0000000002ac4c73: jmp     2ac4ab7h          ;*aload_0
                                                ; - com.gao.concurrentAnt.ticketDemo.GetTicket03::buy@7 (line 47)

  0x0000000002ac4c78: hlt
  0x0000000002ac4c79: hlt
  0x0000000002ac4c7a: hlt
  0x0000000002ac4c7b: hlt
  0x0000000002ac4c7c: hlt
  0x0000000002ac4c7d: hlt
  0x0000000002ac4c7e: hlt
  0x0000000002ac4c7f: hlt
[Exception Handler]
[Stub Code]
  0x0000000002ac4c80: jmp     2a2f2a0h          ;   {no_reloc}
[Deopt Handler Code]
  0x0000000002ac4c85: call    2ac4c8ah
  0x0000000002ac4c8a: sub     qword ptr [rsp],5h
  0x0000000002ac4c8f: jmp     2a07600h          ;   {runtime_call}
  0x0000000002ac4c94: hlt
  0x0000000002ac4c95: hlt
  0x0000000002ac4c96: hlt
  0x0000000002ac4c97: hlt
Java HotSpot(TM) 64-Bit Server VM warning: PrintAssembly is enabled; turning on DebugNonSafepoints to gain additional output

Process finished with exit code 0

我不怎么看得懂汇编,唉,过段时间,得自学一下。

其中搜索关键词lock,还有GetTicket03,就不难找到一些敏感的代码:记得汇编这里的,貌似是通过锁住代码行,来限制对应的物理内存地址?

还是暂且认为它就是 this?🤣

大家怎么看?
在这里插入图片描述
先立一个flag:学习汇编!

啊,生活又有动力了。


最后,作为野生程序员,对视频是感激不尽的(比其他视频通俗易懂),不抱有什么个人看法,这年头,太不容易了。对于小破站上无私奉献的小伙伴,只能衷心大喊一声,好人一生平安~

参考资源:

https://www.cnblogs.com/niceboat/p/9786905.html
https://www.cnblogs.com/zytcomeon/p/12986731.html
https://www.bilibili.com/video/BV1MJ411F7dr?p=12
https://www.cnblogs.com/sqy123/p/9811574.html

感谢一切赐予我们知识的一切

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋夜白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值