网站/小程序/APP个性化定制开发,二开,改版等服务,加扣:8582-36016

    这篇文章主要介绍了synchronized底层实现原理,想弄懂它的实现synchronized的原理,我们只能通过看编译好的字节码文件,下面文章的详细内容,我们就先从测试类开始吧,需要的小伙伴可以参考一下

    测试类:

    public class SynchronizedTest {
        public void get() {
            synchronized (this) {
                System.out.println("小张你好鸭!");
            }
        }
    }


    字节码文件(怎么看?? idea => view => Show ByteCode) 

    再来说原理:

    基于对象的监视器(ObjectMonitor),我们在字节码文件里面可以看到,在同步方法执行前后,有两个指令,进入同步方法前monitorenter,方法执行完成后monitorexit

    我的理解是对象都有一个监视器ObjectMonitor,这个监视器内部有很多属性,比如当前等待线程数、计数器、当前所属线程等;其中计数器属性就是用来记录是否已被线程占有,方法执行到monitorenter时,计数器+1,执行到monitorexit时,计数器-1,线程就是通过这个计数器来判断当前锁对象是否已被占用(0为未占用,此时可以获取锁);

    补充:一个synchronize锁会有两个monitorexit,这是保证synchronize能一定释放锁的机制,一个是方法正常执行完释放,一个是执行过程发生异常时虚拟机释放;


    评论 0

    暂无评论
    0
    0
    0
    立即
    投稿
    发表
    评论
    返回
    顶部