目录
一、Synchronized修饰代码块示例
- 一、Synchronized修饰代码块示例
- 二、命令行窗口查看jvm执行代码块示例
- 三、Synchronized关键字底层原理
package com.xz.thread.t3;
/**
* @description:
* @author: xz
*/
public class Test {
private int value;
public int getValue(){
//进入代码块时jvm执行monitorenter命令
//退出代码块时jvm执行monitorexit命令
synchronized (Test.class){
if(value>0){
return value;
}else{
return -1;
}
}
}
public static void main(String[] args) {
Test t1 = new Test();
new Thread(new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+" "+t1.getValue());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+" "+t1.getValue());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
while(true){
System.out.println(Thread.currentThread().getName()+" "+t1.getValue());
try {
Thread.sleep(100);
} catch (Exception e) {
e.printStackTrace();
}
}
}
}).start();
}
}
二、命令行窗口查看jvm执行代码块示例
1、dos窗口中进入com.xz.thread.t3包下,执行javap -verbose Test.class
2、找到getValue方法,右下图可知,进入代码块时jvm执行monitorenter命令,退出代码块时jvm执行monitorexit命令
- 由第二步可知,synchronized 关键字通过一对字节码指令 monitorenter/monitorexit 实现, 这对指令被 JVM 规范所描述。