java内置锁synchronized是怎么实现的

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的实现涉及到更多的细节,比如性能优化、死锁的处理等

你可能感兴趣的:(并发,java)