怎样在静态方法中使用 synchronized
2017-11-07 00:00
253 查看
synchronized 的实现方式
synchronized的类型可以分为两种:
synchronized method
synchronized block
两者的实现方式是不一样的,jvm 规范中写道,编译后的 synchronized method 会有一个 ACC_SYNCHRONIZED 的 flag,也就是说当 jvm 的方法调用指令(the method invocation instruction)从 the run-time constant pool 中查找到这个 method 的时候,已经知道它是一个synchronized method,所以锁操作是由方法调用以及返回指令来控制的。
而 synchronized block 的锁是由
monitorenter和
monitorexit这两个指令来控制。
可以通过 javap 命令来“反汇编”一下 class 文件。
类和对象
首先要了解的就是类究竟是怎么来的。JVM 拿到编译器编译好的 class 文件后,首先会把文件载入到内存中,class 文件当然会有自己的格式,所以需要由 ClassLoader 来解析文件的内容,这个解析出来的内容会用一个
Class类的实例 - Class object 来表示,这个 object 可以通过 Java 的
ClassName.class来获取。
也就是说,Class object 是一个
Class类型的实例(instance),而对象是一个 ClassName 的 instance。Class 和 ClassName都是类型,ClassName是由
class关键字定义的,而Class是内置类型。
因此成员方法的synchronized method 就等价于 synchronized (this) block,即下面两种方式是等价的。
public synchronized void fun1() { // do something here }
public synchronized void fun2() { synchronized (this) { // do something here } }
成员方法是属于
this,而静态方法是属于 Class Object,那么静态方法的 synchronized method 也就等价于下面这种形式的 synchronized block 了。
public static synchronized void fun2() { synchronized (ClassName.class) { // do something here } }
相关文章推荐
- 怎样在静态方法中使用 synchronized
- 怎样在静态方法中使用 synchronized
- 使用.net-Synchronized属性进行静态方法的同步
- eclipse 中main()函数中的String[] args如何使用?通过String[] args验证账号密码的登录类?静态的主方法怎样才能调用非static的方法——通过生成对象?在类中制作一个方法——能够修改对象的属性值?
- java同步静态方法与非静态方法(使用synchronized关键字)
- 多线程编程 使用 synchronized来同步静态方法 非静态方法 代码块
- synchronized 静态 非静态 方法 使用不同锁对象
- 怎样在自定义HTTPHANDLER中使用SESSION的方法?
- synchronized和native关键字的使用方法
- Server对象有那些属性方法以及怎样使用
- 简易静态方法使用
- Detours2.1静态库编译和使用方法
- .NET Remoting 使用中的问题之静态方法
- Effective Java Item1:优先考虑使用静态工厂方法
- 使用静态工厂方法的好处和坏处
- 在struts2.1.2中不能使用ognl访问静态方法的原因
- 静态类和 关于什么时候使用“静态方法”
- 在对话框中使用picture control显示静态图片的方法
- C#使用静态构造方法
- [开发手记].NET Remoting 使用中的问题之静态方法