Java并发—Synchronized 的本质

栏目: IT技术 · 发布时间: 6年前

内容简介:每个object在设计的时候,都是可以被monitor的,被锁住的,所以使用计数器的方式就可以解决这个锁的问题。这个按上一篇说讲,就是方法通过ACC_SYNCHRONIZED标志位来控制锁。只有static的方法可以synchronized xxx.class,那这个xxx.class是什么。

使用场景

先用一张图来描述使用的场景(图片获取至其他网站。)

Java并发—Synchronized 的本质

总体来说就是方法和代码块2种方式。

代码块的同步

每个object在设计的时候,都是可以被monitor的,被锁住的,所以使用计数器的方式就可以解决这个锁的问题。

方法同步

这个按上一篇说讲,就是方法通过ACC_SYNCHRONIZED标志位来控制锁。

xxx.class锁住的是什么?

只有static的方法可以synchronized xxx.class,那这个xxx.class是什么。

我们先理解static method是什么。按照深入理解JVM的说法,static的本质是一套命名方式,也就是与实例xxx class没有任何本质的关系。

那这些static的方法是存在方法区的固定code,不需要实例化。

我们在回来看这个问题,当实例对象的方法被synchronized的时候,它同步锁住的是什么?就是this。虽然在JVM实现的时候不同,但是在更底层的时候是一样的。

在会过来,既然锁最终是总过对象来持有monitor的,那static的方法,是谁持有?synchroinzed的是什么?

我们继续反编译代码来分析

public static void testB();
    Code:
       0: ldc           #2                  // class com/demanmath/androidms/javabase/concurrent/SynchronizedDemo
       2: dup
       3: astore_0
       4: monitorenter
       5: iconst_0
       6: istore_1
       7: aload_0
       8: monitorexit
       9: goto          17
      12: astore_2
      13: aload_0
      14: monitorexit
      15: aload_2
      16: athrow
      17: return
    Exception table:
       from    to  target type
           5     9    12   any
          12    15    12   any

基本和非static的方法是一直的。也就是也有一个东西,被monitor了

这个东西就是可以被索引这个static方法的Class。所以Synchronized的就是这个Class。对,不是实例,是这个Class。


以上所述就是小编给大家介绍的《Java并发—Synchronized 的本质》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

尽在双11:阿里巴巴技术演进与超越

尽在双11:阿里巴巴技术演进与超越

阿里巴巴集团双11技术团队 / 电子工业出版社 / 2017-4 / 79

“双 11”,诞生于杭州,成长于阿里,风行于互联网,成就于新经济,贡献于全世界。 从 2009 年淘宝商城起,双 11 已历经八年。每年的双 11 既是当年的结束,又是走向未来的起点。技术的突破创新,商业模式的更替交互,推动着双 11 迈步向前。 《尽在双11——阿里巴巴技术演进与超越》是迄今唯一由阿里巴巴集团官方出品、全面阐述双 11 八年以来在技术和商业上演进和创新历程的书籍。内容......一起来看看 《尽在双11:阿里巴巴技术演进与超越》 这本书的介绍吧!

在线进制转换器
在线进制转换器

各进制数互转换器

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

XML 在线格式化
XML 在线格式化

在线 XML 格式化压缩工具