synchronized关键字的底层原理

发布时间:2023年12月18日

底层原理:在Java虚拟机中,每个对象都会有一个监视器锁,也称为内部锁或对象锁。这个锁是用来实现线程同步的机制。当多个线程同时访问同一个对象的synchronized代码块或方法时,只有一个线程能够获取到这个对象的监视器锁,其他线程需要等待。

具体来说,当一个线程执行到一个synchronized代码块时,它需要先获得synchronized代码块所属对象的监视器锁。如果这个锁没有被其他线程占用,那么当前线程就可以进入synchronized代码块执行相应的操作;如果这个锁已经被其他线程占用,那么当前线程就会被阻塞,直到获得锁为止。

对于实例方法(即非静态方法)上的synchronized关键字,它锁定的是当前实例对象的监视器锁;对于静态方法上的synchronized关键字,它锁定的是当前类的Class对象的监视器锁;对于代码块上的synchronized关键字,它锁定的是指定的对象的监视器锁。

下面是一些示例代码来演示synchronized关键字的使用:

  1. 使用在实例方法上的synchronized关键字:
public class Example {
    public synchronized void synchronizedMethod() {
        // synchronized代码块
        // ...
    }
}

  1. 使用在静态方法上的synchronized关键字:
public class Example {
    public static synchronized void synchronizedMethod() {
        // synchronized代码块
        // ...
    }
}

  1. 使用在代码块上的synchronized关键字:
public class Example {
    public void method() {
        synchronized (this) {
            // synchronized代码块
            // ...
        }
    }
}

需要注意的是,synchronized关键字虽然可以确保线程同步,但它的性能可能较低,因为它会造成线程的阻塞和切换。在Java 5之后,另一种更高效的线程同步机制ReentrantLock也被引入,它提供了更灵活的锁定方式,并且可以显示地控制锁的获取和释放。在实际开发中,应根据具体的需求来选择合适的线程同步机制。

文章来源:https://blog.csdn.net/Flying_Fish_roe/article/details/135064804
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。