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
…
感谢一切赐予我们知识的一切