java内置锁synchronized是怎么实现的

synchronized在JVM中通过监视器对象实现,涉及对象头的锁定状态标志位。线程进入同步代码需检查锁定,已锁定则阻塞,执行完毕后清除标志位。简化的JVM源码展示了加锁和解锁过程,实际实现还包括性能优化和死锁处理。
摘要由CSDN通过智能技术生成

JVM中,synchronized的实现是基于监视器(monitor)对象来实现的。监视器对象在JVM内部是由一个与之关联的管程(monitor)来实现的,管程其实就是在Object类中标识为synchronized的方法或者代码块。

简单来说,JVM中的synchronized实现流程如下:

线程进入synchronized代码块或者方法,检查是否处于锁定状态。
如果没有被锁定,JVM会在当前对象头(Object Header)中为该对象加上一个锁定状态的标志位。
如果已经被锁定,线程就进入阻塞状态,等待监视器对象被释放。
线程获取到锁定状态后执行同步代码块或者方法。
同步代码块或方法执行完毕后,JVM会清除对象头中的锁定状态标志位,并唤醒等待该监视器对象的线程。
下面是一些简化的JVM实现源码片段,用于说明synchronized在JVM中的实现:

1.锁定一个对象

// 加锁
enter_monitor(objectref);// 解锁
exit_monitor(objectref);

2.检查一个对象是否已经被锁定

int32_t test_if_acquired(Object *object) {
    // 判断对象是否已被锁定
    if (object->header == -1) {
        // 如果对象已被锁定,则等待锁的释放,线程进入线程等待队列等待
        add_to_monitorenter_queue(object);
        return 0;
    }
    else {
        // 如果对象还未被锁定,则将对象标记为锁定(标记位设置为 -1)
        object->header = -1;
        return 1;
    }
}

上述代码片段是一些简化的JVM实现源码,以说明synchronized在JVM中的实现方式。实际JVM的实现涉及到更多的细节,比如性能优化、死锁的处理等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值