当JVM执行一个方法时,执行中的线程识别该方法的method_info结构是否有ACC_SYNCHRONIZED标记设置,然后它自动获取对象的锁,调用方法,最后释放锁。如果有异常发生,线程自动释放锁。
同步化一个方法块会超过JVM对获取对象锁和异常处理的内置支持,要求以字节代码显式写入功能。如果使用同步方法读取一个方法的字节代码,就会看到有十几个额外的操作用于管理这个功能。
public class Sync {
private int i;
public synchronized int synchronizedMethodGet() {
return i;
}
public int synchronizedBlockGet() {
synchronized( this ) {
return i;
}
}
}
反编译出的字节码:
D:\Java\jdk1.6.0_02\bin>javap -c Sync
Compiled from "Sync.java"
public class Sync extends java.lang.Object{
public Sync();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return
public synchronized int synchronizedMethodGet();
Code:
0: aload_0
1: getfield #2; //Field i:I
4: ireturn
public int synchronizedBlockGet();
Code:
0: aload_0
1: dup
2: astore_1
3: monitorenter
4: aload_0
5: getfield #2; //Field i:I
8: aload_1
9: monitorexit
10: ireturn
11: astore_2
12: aload_1
13: monitorexit
14: aload_2
15: athrow
Exception table:
from to target type
4 10 11 any
11 14 11 any
}
分享到:
相关推荐
主要介绍了java 中同步方法和同步代码块的区别是什么的相关资料,需要的朋友可以参考下
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
主要介绍了 java中synchronized(同步代码块和同步方法)详解及区别的相关资料,需要的朋友可以参考下
【Java基础知识 第四节 多线程复习】中,同步代码块(synchronized关键字)的两个练习代码。
主要介绍了Java同步代码块和同步方法原理与应用,结合具体案例形式分析了使用java同步代码块和同步方法实现买票功能的相关原理与操作技巧,需要的朋友可以参考下
【IT十八掌徐培成】Java基础第08天-03.多线程-同步代码块-同步方法.zip
Java多线程--同步机制解决线程安全问题方式一:同步代码块
synchronized关键字可以用来标识四种不同类型的块:- 实例方法- 静态方法- 实例方法中的代码块- 静态方法中的代码块同步实例方法public syn
java使用datax增量同步代码,直接放到项目可使用,支持增量,全量可配置,同步一张表只需添加一条记录
下面小编就为大家带来一篇浅谈同步监视器之同步代码块、同步方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
用于MQ同步的代码 可以配置多个接收和发送队列 用于分发
在本节的例程中,我们只是要防止线程进入同步代码区域中,所以lpName参数设置为nil。 3、在同步代码前用WaitForSingleObject()函数。该函数使得线程取得互斥对象(同步代码)的拥有权。该函数定义为: DWORD ...
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
sleep()与wait()的区别 1.这两个方法来自不同...(如果不是在同步方法或同步代码块中调用wait()方法,则抛出IllegalMOnitorStateException,它是RuntimeException的一个子类,因此,不需要try-catch语句进行捕捉异常)
在学习Java过程中,自己收集了很多的Java的学习资料,分享给大家,有需要的欢迎下载,希望对大家有用,一起学习,一起进步。
计算机后端-Java-Java核心基础-第20章 多线程 07. 同步代码块处理实现Runnable的线程安全问题.avi
计算机后端-Java-Java核心基础-第20章 多线程 08. 同步代码块处理继承Thread类的线程安
对于synchronized语句当Java源代码被javac编译成bytecode的时候,会在同步代码块的入口位置和退出位置分别插入monitorenter和monitorexit(2个)字节码指令。而synchronized方法则会被翻译成普通的方法调用和返回指令...
Java 同步方式 wait和notify/notifyall