您当前的位置: 首页 >  Java

小志的博客

暂无认证

  • 0浏览

    0关注

    1217博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

Java并发多线程编程——Synchronized关键字的原理(jvm层面)

小志的博客 发布时间:2021-04-16 08:41:16 ,浏览量:0

目录
    • 一、Synchronized修饰代码块示例
    • 二、命令行窗口查看jvm执行代码块示例
    • 三、Synchronized关键字底层原理

一、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关键字底层原理
  • 由第二步可知,synchronized 关键字通过一对字节码指令 monitorenter/monitorexit 实现, 这对指令被 JVM 规范所描述。
关注
打赏
1661269038
查看更多评论
立即登录/注册

微信扫码登录

0.0432s