0
点赞
收藏
分享

微信扫一扫

synchronized关键字的原理,flutter跳转动画

新鲜小饼干 2022-03-11 阅读 74
面试

public class TestSync {

private final static Object lock = new Object();

public void accessResource() {

synchronized(lock) {

try {

TimeUnit.MINUTES.sleep(10);

} catch (InterruptedException e) {

e.printStackTrace();

}

}

}

public static void main(String[] args) {

final TestSync sync = new TestSync();

for(int i =0;i<5;i++) {

new Thread(){

@Override

public void run() {

sync.accessResource();

}

}.start();

}

}

}

上面的代码定义一个方法accessResource,并且使用synchronized来对代码进行同步,同时定义了5个线程调用accessResource方法,由于synchronized的互斥性,只能有一个线程获得lock的monitor锁,其他线程只能进入阻塞状态,等待获取lock的monitor锁。针对这个monitor锁我们如何从线程堆栈信息来看呢?其实,jstack命令在Java中可以用来打印进程的线程堆栈信息。我们来运行这个Java程序,在终端通过top命令查看运行起来的Java程序的进程id,然后执行jstack ‘pid’。我们来看下打印出来的信息:

通过截图可以看到Thread-0持有monitor<0x00000007955f2130>的锁并且处于休眠状态中,而其他几个线程则是处于BLOCKED状态中,它们是在等待着获取monitor<0x00000007955f2130>的锁。

JVM指令分析

从JVM指令角度再来分析synchronized关键字。我们可以使用javap这个命令来对上面这个TestSync类生成的class字节码进行反编译,得到下面的JVM指令。

Compiled from “TestSync.java”

public class main.TestSync {

static {};

Code:

0: new #3 // class java/lang/Object

3: dup

4: invokespecial #10 // Method java/lang/Object.""😦)V

7: putstatic #13 // Field lock:Ljava/lang/Object;

10: return

public main.TestSync();

Code:

0: aload_0

1: invokespecial #10 // Method java/lang/Object.""😦)V

4: return

public void accessResource();

Code:

0: getstatic #13 // Field lock:Ljava/lang/Object;

3: dup

4: astore_1

5: monitorenter

6: getstatic #20 // Field java/util/concurrent/TimeUnit.MINUTES:Ljava/util/concurrent/TimeUnit;

9: ldc2_w #26 // long 10l

12: invokevirtual #28 // Method java/util/concurrent/TimeUnit.sleep:(J)V

15: goto 23

18: astore_2

19: aload_2

20: invokevirtual #32 // Method java/lang/InterruptedException.printStackTrace:()V

23: aload_1

24: monitorexit

25: goto 31

28: aload_1

29: monitorexit

30: athrow

31: return

Exception table:

from to target type

6 15 18 Class java/lang/InterruptedException

6 25 28 any

28 30 28 any

public static void main(java.lang.String[]);

Code:

0: new #1 // class main/TestSync

3: dup

4: invokespecial #44 // Method “”😦)V

7: astore_1

8: iconst_0

9: istore_2

10: goto 27

13: new #45 // class main/TestSync$1

16: dup

17: aload_1

18: invokespecial #47 // Method main/TestSync$1."":(Lmain/TestSync;)V

21: invokevirtual #50 // Method main/TestSync$1.start:()V

24: iinc 2, 1

27: iload_2

28: iconst_5

29: if_icmplt 13

32: return

总结

最后对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!

这里附上上述的技术体系图相关的几十套腾讯、头条、阿里、美团等公司20年的面试题,把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节,由于篇幅有限,这里以图片的形式给大家展示一部分。

相信它会给大家带来很多收获:

上述【高清技术脑图】以及【配套的面试真题PDF】可以点击我的GitHub免费获取

AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)中已收录,里面包含不同方向的自学编程路线、面试题集合/面经、及系列技术文章等,资源持续更新中…

举报

相关推荐

0 条评论