内容简介:每个object在设计的时候,都是可以被monitor的,被锁住的,所以使用计数器的方式就可以解决这个锁的问题。这个按上一篇说讲,就是方法通过ACC_SYNCHRONIZED标志位来控制锁。只有static的方法可以synchronized xxx.class,那这个xxx.class是什么。
使用场景
先用一张图来描述使用的场景(图片获取至其他网站。)
总体来说就是方法和代码块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 的本质》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Java编程思想
埃克尔 / 机械工业出版社 / 2007-5-1 / 79.00元
《Java编程思想(英文版•第4版)》内容简介:特色:1.适合初学者与专业人员的经典的面向对象的叙述方式;为更新的Java SE5/6的相关内容增加了新的示例和章节。2.测验框架显示程序输出。3.设计模式贯穿于众多示例中:适配器、桥接器、职责链、命令、装饰器、外观、工厂方法、享元、点名、数据传输对象、空对象、代理、单例、状态、策略、模板方法以及访问者。4.为数据传输引入了XML;为用户界面引入了S......一起来看看 《Java编程思想》 这本书的介绍吧!