今天在探究多线程的时候,想验证一下count++;(int count;)是不是一个原子操作,后来看了别人的解释才发现可以用javap来进项查看:
那么,
一、首先我们得了解什么是javap,它可以用来干啥子?
大多数Java程序员知道他们的程序不是编译成本机代码的。实际上,程序被编译成中间字节代码,由Java虚拟机来解释执行。然而,很少程序员注意一下字节代码,因为他们使用的工具不鼓励他们这样做。大多数的Java调试工具不允许单步的字节代码调试。这些工具要么显示源代码,要么什么都不显示。幸好JDK提供了Java类分解器javap,一个命令行工具。javap对类名给定的文件(.class)提供的字节代码进行反编译,打印出这些类的一个可读版本。在缺省情况下,javap打印出给定类内的公共域、方法、构造函数,以及静态初始值。
二、知道是什么之后,那么它怎么用?
javap的具体用法
语法: javap <选项> <类名> ,这样看起来好像有一点含糊,所以接下来我们写一个实际的例子,来进行探讨,手把手教学使用javap。
三、javap的常规使用以及分析结果
3.1、案例:这里我们验证count++是不是原子操作:
java代码:
public class test {
private static int count = 1 ;
public void increase(){
count++;
}
}
然后使用javac命令来编译这个.java文件以生成.class文件-------------------win+r----cmd----切换到test.java的目录下,然后输入javac test.java------回车,就会在同级目录下产生test.class文件,这里我们用记事本或者notapad打开发现是乱码,没法观看。
此时就可以使用javap命令来给我们帮助了:
在cmd中输入javap -c -p test.class即可:
这里我们可以看到在increase方法中,count++对应的机器码有5个(getstatic:取count的值,放在操作数堆栈中;iconst_1:将int类型常量1压入栈;iadd:进行操作数相加操作;putstatic:把结果放回操作数堆栈中;return :返回。拙见,不正确的话欢迎纠正。),这就说明count++并不是一个原子操作。
3.2:javap的常用选项:在cmd中输入javap --help,或者javap -help 或者javap -?即可
C:\Users\袁\Desktop>javap --help
用法: javap <options> <classes>
其中, 可能的选项包括:
-help --help -? 输出此用法消息
-version 版本信息
-v -verbose 输出附加信息