当前位置: 首页 > news >正文

openjdk11 jvm视角查看java线程异常退出synchronized锁自动释放

##synchronized锁异常 java代码demo

public class ThreadTest {public int mul = 1;public static void main(String[] args) {ThreadTest threadTest = new ThreadTest();Thread yym_user_thread1 = new Thread() {public void run() {System.out.println("yym_user_thread1");threadTest.resources(0);}};yym_user_thread1.setName("yym_user_thread1");yym_user_thread1.start();////Thread.yield();Thread.yield();Thread.yield();Thread.yield();Thread.yield();Thread.yield();Thread yym_user_thread2 = new Thread() {public void run() {System.out.println("yym_user_thread2");threadTest.resources(1);}};yym_user_thread2.setName("yym_user_thread2");yym_user_thread2.start();}public  void resources(int number) {synchronized(this) {for (int i = 0; i < 10000; i++) {mul++;}int result = mul / number;System.out.println("resources" + result);}}}

##javap -v ThreadTest 查看monitorenter monitorexit字节码

major version: 55flags: (0x0021) ACC_PUBLIC, ACC_SUPERthis_class: #3                          // ThreadTestsuper_class: #17                        // java/lang/Objectinterfaces: 0, fields: 1, methods: 3, attributes: 4
{0x0000000705f0f9a0}Constant pool:
{0x0000000705f2dd10}   #1 = Methodref          #17.#34        // java/lang/Object."<init>":()V#2 = Fieldref           #3.#35         // ThreadTest.mul:I
{0x0000000705fc52e0}   #3 = Class              #36            // ThreadTest#4 = Methodref          #3.#34         // ThreadTest."<init>":()V#5 = Class              #37            // ThreadTest$1#6 = Methodref          #5.#38         // ThreadTest$1."<init>":(LThreadTest;)V#7 = String             #39            // yym_user_thread1#8 = Methodref          #40.#41        // java/lang/Thread.setName:(Ljava/lang/String;)V#9 = Methodref          #40.#42        // java/lang/Thread.start:()V#10 = Methodref          #40.#43        // java/lang/Thread.yield:()V#11 = Class              #44            // ThreadTest$2#12 = Methodref          #11.#38        // ThreadTest$2."<init>":(LThreadTest;)V#13 = String             #45            // yym_user_thread2#14 = Fieldref           #46.#47        // java/lang/System.out:Ljava/io/PrintStream;
{0x000000070610aa38}{0x0000000706114b80}{0x000000070613dfd0}  #15 = InvokeDynamic      #0:#51         // #0:makeConcatWithConstants:(I)Ljava/lang/String;#16 = Methodref          #52.#53        // java/io/PrintStream.println:(Ljava/lang/String;)V#17 = Class              #54            // java/lang/Object#18 = Utf8               InnerClasses#19 = Utf8               mul#20 = Utf8               I#21 = Utf8               <init>#22 = Utf8               ()V#23 = Utf8               Code#24 = Utf8               LineNumberTable#25 = Utf8               main#26 = Utf8               ([Ljava/lang/String;)V#27 = Utf8               resources#28 = Utf8               (I)V#29 = Utf8               StackMapTable#30 = Class              #55            // java/lang/Throwable#31 = Utf8               SourceFile#32 = Utf8               ThreadTest.java#33 = Utf8               NestMembers#34 = NameAndType        #21:#22        // "<init>":()V#35 = NameAndType        #19:#20        // mul:I#36 = Utf8               ThreadTest#37 = Utf8               ThreadTest$1#38 = NameAndType        #21:#56        // "<init>":(LThreadTest;)V#39 = Utf8               yym_user_thread1#40 = Class              #57            // java/lang/Thread#41 = NameAndType        #58:#59        // setName:(Ljava/lang/String;)V#42 = NameAndType        #60:#22        // start:()V#43 = NameAndType        #61:#22        // yield:()V#44 = Utf8               ThreadTest$2#45 = Utf8               yym_user_thread2#46 = Class              #62            // java/lang/System#47 = NameAndType        #63:#64        // out:Ljava/io/PrintStream;#48 = Utf8               BootstrapMethods
{0x0000000706184b20}  #49 = MethodHandle       6:#65          // REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;#50 = String             #66            // resources\u0001#51 = NameAndType        #67:#68        // makeConcatWithConstants:(I)Ljava/lang/String;#52 = Class              #69            // java/io/PrintStream#53 = NameAndType        #70:#59        // println:(Ljava/lang/String;)V#54 = Utf8               java/lang/Object#55 = Utf8               java/lang/Throwable#56 = Utf8               (LThreadTest;)V#57 = Utf8               java/lang/Thread#58 = Utf8               setName#59 = Utf8               (Ljava/lang/String;)V#60 = Utf8               start#61 = Utf8               yield#62 = Utf8               java/lang/System#63 = Utf8               out#64 = Utf8               Ljava/io/PrintStream;#65 = Methodref          #71.#72        // java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;#66 = Utf8               resources\u0001#67 = Utf8               makeConcatWithConstants#68 = Utf8               (I)Ljava/lang/String;#69 = Utf8               java/io/PrintStream#70 = Utf8               println#71 = Class              #73            // java/lang/invoke/StringConcatFactory#72 = NameAndType        #67:#76        // makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;#73 = Utf8               java/lang/invoke/StringConcatFactory#74 = Class              #78            // java/lang/invoke/MethodHandles$Lookup#75 = Utf8               Lookup#76 = Utf8               (Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;#77 = Class              #79            // java/lang/invoke/MethodHandles#78 = Utf8               java/lang/invoke/MethodHandles$Lookup#79 = Utf8               java/lang/invoke/MethodHandles
{public int mul;
{0x00000007061ad120}    descriptor: Iflags: (0x0001) ACC_PUBLICpublic ThreadTest();descriptor: ()Vflags: (0x0001) ACC_PUBLICCode:
{0x00000007061d5a80}{0x000000070601ee30}      stack=2, locals=1, args_size=10: aload_01: invokespecial #1                  // Method java/lang/Object."<init>":()V4: aload_05: iconst_16: putfield      #2                  // Field mul:I9: returnLineNumberTable:line 1: 0line 3: 4public static void main(java.lang.String[]);descriptor: ([Ljava/lang/String;)Vflags: (0x0009) ACC_PUBLIC, ACC_STATICCode:stack=3, locals=4, args_size=10: new           #3                  // class ThreadTest3: dup4: invokespecial #4                  // Method "<init>":()V7: astore_18: new           #5                  // class ThreadTest$111: dup12: aload_113: invokespecial #6                  // Method ThreadTest$1."<init>":(LThreadTest;)V16: astore_217: aload_218: ldc           #7                  // String yym_user_thread120: invokevirtual #8                  // Method java/lang/Thread.setName:(Ljava/lang/String;)V23: aload_224: invokevirtual #9                  // Method java/lang/Thread.start:()V27: invokestatic  #10                 // Method java/lang/Thread.yield:()V30: invokestatic  #10                 // Method java/lang/Thread.yield:()V33: invokestatic  #10                 // Method java/lang/Thread.yield:()V36: invokestatic  #10                 // Method java/lang/Thread.yield:()V39: invokestatic  #10                 // Method java/lang/Thread.yield:()V42: invokestatic  #10                 // Method java/lang/Thread.yield:()V45: new           #11                 // class ThreadTest$248: dup49: aload_150: invokespecial #12                 // Method ThreadTest$2."<init>":(LThreadTest;)V53: astore_354: aload_355: ldc           #13                 // String yym_user_thread257: invokevirtual #8                  // Method java/lang/Thread.setName:(Ljava/lang/String;)V60: aload_361: invokevirtual #9                  // Method java/lang/Thread.start:()V64: returnLineNumberTable:line 6: 0line 7: 8line 13: 17line 14: 23line 17: 27line 18: 36line 19: 45line 25: 54line 26: 60line 27: 64public void resources(int);descriptor: (I)Vflags: (0x0001) ACC_PUBLICCode:stack=3, locals=5, args_size=20: aload_01: dup2: astore_23: monitorenter4: iconst_05: istore_36: iload_37: sipush        1000010: if_icmpge     2913: aload_014: dup15: getfield      #2                  // Field mul:I18: iconst_119: iadd20: putfield      #2                  // Field mul:I23: iinc          3, 126: goto          629: aload_030: getfield      #2                  // Field mul:I33: iload_134: idiv35: istore_336: getstatic     #14                 // Field java/lang/System.out:Ljava/io/PrintStream;39: iload_340: invokedynamic #15,  0             // InvokeDynamic #0:makeConcatWithConstants:(I)Ljava/lang/String;45: invokevirtual #16                 // Method java/io/PrintStream.println:(Ljava/lang/String;)V48: aload_249: monitorexit50: goto          6053: astore        455: aload_256: monitorexit57: aload         459: athrow60: returnException table:from    to  target type4    50    53   any53    57    53   anyLineNumberTable:line 30: 0line 31: 4line 32: 13line 31: 23line 34: 29line 35: 36line 36: 48line 37: 60StackMapTable: number_of_entries = 4frame_type = 253 /* append */offset_delta = 6locals = [ class java/lang/Object, int ]frame_type = 250 /* chop */offset_delta = 22frame_type = 87 /* same_locals_1_stack_item */stack = [ class java/lang/Throwable ]frame_type = 250 /* chop */offset_delta = 6
}
SourceFile: "ThreadTest.java"
NestMembers:ThreadTest$2ThreadTest$1
InnerClasses:#11;                                    // class ThreadTest$2#5;                                     // class ThreadTest$1public static final #75= #74 of #77;    // Lookup=class java/lang/invoke/MethodHandles$Lookup of class java/lang/invoke/MethodHandles
BootstrapMethods:0: #49 REF_invokeStatic java/lang/invoke/StringConcatFactory.makeConcatWithConstants:(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;Method arguments:#50 resources\u0001

##gdb线程栈  异常处理

(gdb) c
Continuing.
@@@@-yym-Thread PID: 4160
@@@@-yym-Thread NAME: yym_user_thread2
yym_user_thread2
[Switching to Thread 0x7fffc9d6c700 (LWP 4157)]Thread 18 "C2 CompilerThre" hit Breakpoint 4, JavaThread::exit (this=0x7fffa4220800, destroy_vm=false, exit_type=JavaThread::normal_exit)at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/thread.cpp:1917
1917      this->clear_pending_exception();
(gdb) c
Continuing.
[Switching to Thread 0x7fffc9b6a700 (LWP 4159)]Thread 20 "yym_user_thread" hit Breakpoint 4, JavaThread::exit (this=0x7ffff07bd800, destroy_vm=false, exit_type=JavaThread::normal_exit)at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/thread.cpp:1917
1917      this->clear_pending_exception();
(gdb) s
ThreadShadow::clear_pending_exception (this=0x7ffff07bd800) at /home/yym/code/jdk11u-master/src/hotspot/share/utilities/exceptions.cpp:59
59      void ThreadShadow::clear_pending_exception() {
(gdb) list
54        _pending_exception = exception;
55        _exception_file    = file;
56        _exception_line    = line;
57      }
58
59      void ThreadShadow::clear_pending_exception() {
60        LogTarget(Debug, exceptions) lt;
61        if (_pending_exception != NULL && lt.is_enabled()) {
62          ResourceMark rm;
63          LogStream ls(lt);
(gdb) n
60        LogTarget(Debug, exceptions) lt;
(gdb) p exception
No symbol "exception" in current context.
(gdb) n
61        if (_pending_exception != NULL && lt.is_enabled()) {

 ##抛出异常

##方法退出

 ##gdb调试

(gdb) b thread.cpp:1917(gdb) p *_pending_exception
$8 = {_mark = 0x7ffff07bd805, _metadata = {_klass = 0xe294f72300014610, _compressed_klass = 83472}}
(gdb) call _pending_exception->print_on(tty)
java.lang.ArithmeticException
{0x0000000714a7b8f0} - klass: 'java/lang/ArithmeticException'- ---- fields (total size 5 words):- private transient 'backtrace' 'Ljava/lang/Object;' @12  a 'java/lang/Object'[5] {0x0000000714a7b918} (e294f723)- private 'detailMessage' 'Ljava/lang/String;' @16  "/ by zero"{0x0000000714a7b8b8} (e294f717)- private 'cause' 'Ljava/lang/Throwable;' @20  a 'java/lang/ArithmeticException'{0x0000000714a7b8f0} (e294f71e)- private 'stackTrace' '[Ljava/lang/StackTraceElement;' @24  a 'java/lang/StackTraceElement'[0] {0x0000000715120a70} (e2a2414e)- private strict 'suppressedExceptions' 'Ljava/util/List;' @28  a 'java/util/Collections$EmptyList'{0x000000071510bb90} (e2a21772)- private transient 'depth' 'I' @32  2
(gdb) bt
#0  ThreadShadow::clear_pending_exception (this=0x7ffff07bd800) at /home/yym/code/jdk11u-master/src/hotspot/share/utilities/exceptions.cpp:61
#1  0x00007ffff6173b7c in JavaThread::exit (this=0x7ffff07bd800, destroy_vm=false, exit_type=JavaThread::normal_exit)at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/thread.cpp:1917
#2  0x00007ffff61738ef in JavaThread::thread_main_inner (this=0x7ffff07bd800) at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/thread.cpp:1875
#3  0x00007ffff617374a in JavaThread::run (this=0x7ffff07bd800) at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/thread.cpp:1850
#4  0x00007ffff616f8eb in Thread::call_run (this=0x7ffff07bd800) at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/thread.cpp:387
#5  0x00007ffff5f703fd in thread_native_entry (thread=0x7ffff07bd800) at /home/yym/code/jdk11u-master/src/hotspot/os/linux/os_linux.cpp:827
#6  0x00007ffff71c56ba in start_thread (arg=0x7fffc9b6a700) at pthread_create.c:333
#7  0x00007ffff790051d in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:109
(gdb)

##yym_user_thread1释放锁

(gdb) set args ThreadTest
(gdb) handle SIGSEGV pass noprint nostop
Signal        Stop      Print   Pass to program Description
SIGSEGV       No        No      Yes             Segmentation fault
(gdb) handle SIGFPE pass noprint nostop
Signal        Stop      Print   Pass to program Description
SIGFPE        No        No      Yes             Arithmetic exception
(gdb) b thread.cpp:1917
(gdb) b ObjectMonitor::exit
(gdb)b ObjectMonitor::ExitEpilogInterpreterRuntime::monitorexit (thread=0x7ffff06c6800, elem=0x7fffc9b695d8) at /home/yym/code/jdk11u-master/src/hotspot/share/interpreter/interpreterRuntime.cpp:801
801       elem->set_obj(NULL);
(gdb) n
803       thread->last_frame().interpreter_frame_verify_monitor(elem);
(gdb) n
788     IRT_ENTRY_NO_ASYNC(void, InterpreterRuntime::monitorexit(JavaThread* thread, BasicObjectLock* elem))
(gdb) p thread->print_on(tty)
"yym_user_thread1" #12 prio=5 os_prio=0 cpu=1.74ms elapsed=132.10s tid=0x00007ffff06c6800 nid=0x2163 runnable  [0x00007fffc9b69000]java.lang.Thread.State: RUNNABLEJavaThread state: _thread_in_vm
Thread: 0x00007ffff06c6800  [0x2163] State: _call_back _has_called_back 0 _at_poll_safepoint 0JavaThread state: _thread_in_vm
$7 = void
(gdb)

##唤醒其他线程

(gdb) n
[Switching to Thread 0x7fffc9b6a700 (LWP 9733)]Thread 20 "yym_user_thread" hit Breakpoint 4, ObjectMonitor::ExitEpilog (this=0x7fffb0008b80, Self=0x7ffff072f000, Wakee=0x7fffc9a68600)at /home/yym/code/jdk11u-master/src/hotspot/share/runtime/objectMonitor.cpp:1283
1283      assert(_owner == Self, "invariant");
(gdb) n
1291      _succ = Knob_SuccEnabled ? Wakee->_thread : NULL;
(gdb) n
1292      ParkEvent * Trigger = Wakee->_event;

##main释放锁-等待日后验证,现阶段不知道干啥的

(gdb) b thread.cpp:2040


http://www.mrgr.cn/news/6674.html

相关文章:

  • 深入解析ASP.NET Core 中间件:如何构建高效的请求处理管道
  • 七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
  • 谷粒商城实战笔记-248-商城业务-消息队列-RabbitMQ简介
  • MongoDB快速入门CRUD
  • Docker 部署loki日志 用于微服务
  • 《通义千问AI落地—下》:WebSocket详解
  • 使用nginx做代理转发
  • 区块链基础通识(1)——分布式系统的共识问题
  • easyexcel--多sheet页导入导出
  • 使用[KafkaStreams流计算框架实时计算产生报警(升级报警)
  • Xmind 在线导图上线!多设备实时同步,节约本地空间
  • 系统编程 网络 协议问题总结
  • VoLTE基本信令流程(整理的学习笔记)
  • 操作系统临时
  • SFC 和 DISM 使用区别 【附加使用方式】
  • MS SQL Server partition by 函数实战二 编排考场人员
  • VScode的python虚拟环境
  • C语言 | Leetcode C语言题解之第368题最大整除子集
  • SpringBoot项目多线程实现定时任务-只需要三步
  • Educational Codeforces Round 169 (Rated for Div. 2)