Java对象锁详解(定义作用及原理实现)

Java对象锁详解(定义作用及原理实现)-mikechen

什么是Java对象锁

Java对象锁是一种同步机制,用于协调多个线程对共享资源的访问。

在Java中每个对象都与一个监视器相关联,这个监视器可以被线程获取,从而控制对对象的访问。

 

Java对象锁作用

Java对象锁的主要作用是协调多个线程对共享资源的访问,确保在任意时刻只有一个线程可以执行被锁定的代码块或方法。

除此之外,使用对象锁是实现线程安全性的一种重要手段。

通过对象锁,可以将一系列操作组合成原子性操作,即这些操作要么全部执行成功,要么全部不执行。

 

Java对象锁实现

Java对象锁是通过synchronized关键字来实现的,如下所示:

public class Example {
    private Object lock = new Object();

    public void synchronizedBlock() {
        synchronized (lock) {
            // 同步块
        }
    }
}

当一个线程希望访问一个被synchronized修饰的方法或代码块时,它必须先获得对象锁。

如果对象锁已经被其他线程持有,那么该线程就会被阻塞,直到它能够获取到锁为止。

一旦线程获取到对象锁,它就可以执行相应的代码,而其他线程则不能同时访问这段被锁定的代码。

 

Java对象锁原理

Java对象锁的实现原理涉及到Java中的监视器、内置锁(Intrinsic Lock)和线程的状态切换。

1.监视器对象(Monitor Object)

每个Java对象都与一个监视器相关联,这个监视器用于控制对对象的访问,监视器对象是实现同步的基础。

如下图所示:

Java对象锁详解(定义作用及原理实现)-mikechen

上图是Synchronized同步代码块反编译后的截图,可以很清楚的看见monitor的调用,主要就是上图红色的monitorenter和monitorexit来实现,获取锁与释放锁。

 

2.内置锁(Intrinsic Lock)

每个Java对象都有一个内置锁,也称为监视器锁(Monitor Lock)或对象锁,这个锁是与对象关联的,用于协调多个线程对对象的访问。

当一个线程进入synchronized修饰的方法或代码块时,它会尝试获取对象的内置锁。

如果锁已经被其他线程持有,线程将被阻塞直到获取到锁为止。

 

3.线程的状态切换

当一个线程尝试获取对象锁而失败时,它会进入一个等待状态,等待其他线程释放锁。

这通常涉及到操作系统层面的线程状态切换,如从运行状态到阻塞状态。

当持有锁的线程执行完synchronized代码块或方法时,它会释放锁,同时通知等待中的线程,使其中的一个线程有机会获取锁。

陈睿mikechen

十余年BAT架构经验,资深技术专家,就职于阿里、淘宝、百度等一线互联网大厂。

关注「mikechen」公众号,获取更多技术干货!

后台回复面试即可获取《史上最全阿里Java面试题总结》,后台回复架构,即可获取《阿里架构师进阶专题全部合集

评论交流
    说说你的看法