synchronized底层原理和锁优化

synchronized底层原理

众所周知 synchronized 关键字是解决并发问题常用解决方案,有以下三种使用方式:

  • 同步普通方法,锁的是当前对象。
  • 同步静态方法,锁的是当前 Class 对象。
  • 同步块,锁的是 () 中的对象。

实现原理:

JVM 是通过进入、退出对象监视器( Monitor )来实现对方法、同步块的同步的。

具体实现是在编译之后在同步方法调用前加入一个 monitor.enter 指令,在退出方法和异常处插入 monitor.exit 的指令。

其本质就是对一个对象监视器( Monitor )进行获取,而这个获取过程具有排他性从而达到了同一时刻只能一个线程访问的目的。

而对于没有获取到锁的线程将会阻塞到方法入口处,直到获取锁的线程 monitor.exit 之后才能尝试继续获取锁。

流程图如下:

在这里插入图片描述
通过一段代码来演示:

public static void main(String[] args) {
   
        synchronized (Test.class){
   
            System.out.println("sss");
        }
    }

使用 javap -c 可以查看编译之后的具体信息。

public class Test.Test {
   
  public Test.Test();
    Code:
       0: aload_0
       1: invokespecial #1                  // Method java/lang/Object."<init>":()V
       4: return

  public 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: "synchronized" 关键字的底层原理是基于 Java 的内置(Monitor)机制。 Java 中的是通过对象的 monitor 实现的,每个对象都有一个对应的 monitor。当线程进入一个对象的 synchronized 代码块时,它会请求该对象的 monitor,如果该 monitor 没有被其他线程占用,则该线程获得该 monitor 并执行代码块,否则该线程阻塞,直到该 monitor 被释放。 通过使用 monitor,Java 可以保证同一时刻只有一个线程能够访问该对象的 synchronized 代码块,从而实现线程同步。 因此,"synchronized" 关键字实现了线程同步的功能,并且可以避免因竞争访问共享资源导致的线程安全问题。 ### 回答2: synchronized是Java中的关键字,用于实现多线程同步。它的底层原理是通过对象的内部(也称为监视器)来实现线程的互斥访问。 在Java中,每个对象都有一个与之关联的内部。当一个线程尝试进入被synchronized修饰的代码块时,它会首先尝试获得该对象的内部。如果没有被其他线程所占用,那么该线程就会获取到,并且进入临界区执行代码。如果已经被其他线程所占用,那么该线程就会进入阻塞状态,直到被释放。 在synchronized实现中,的状态有两种:被线程占用和未被占用。当一个线程获得后,它会将的状态设置为已被占用。其他线程在尝试获取该时,会发现已被占用,它们会进入的等待队列中,等待获取的线程释放。 在Java语言规范中,对synchronized关键字进行了优化,包括偏向、轻量级和重量级三种状态,这样可以在不同场景下提高并发性能。 总结来说,synchronized底层原理是通过对象的内部实现线程的互斥访问。通过获取和释放的机制,保证了同一时间只有一个线程能够访问被synchronized修饰的代码块,从而保证了线程安全。这种机制虽然简单,但在多线程编程中起着重要的作用。 ### 回答3: synchronized 是 Java 中用来实现线程同步的关键字。它的底层原理主要是通过对象的监视器实现的。具体来说,Java 中的每个对象都有一个与之相关联的监视器,也称为内部或互斥。 当线程进入一个 synchronized 代码块或方法时,它会尝试获取对象的监视器。如果该没有被其他线程占用,那么当前线程就可以获取到,并进入临界区。如果该已经被其他线程占用,则当前线程就会被阻塞,并且进入等待队列。 一旦当前线程进入临界区,它就可以执行 synchronized 代码块或方法中的内容。其他线程如果想要执行该 synchronized 代码块或方法,就必须等待当前线程释放。只有当当前线程执行完 synchronized 代码块或方法,且释放了,其他线程才有机会获取到并执行相应的代码。 synchronized 的原理可以用实例来解释。假设有一个共享资源,例如一个变量,多个线程同时修改该变量的值。如果没有同步机制,可能会导致不可预期的结果。但是当我们使用 synchronized 关键字对修改该变量的代码进行同步,每次只有一个线程能够获取到并修改变量的值,这样就保证了线程安全。 总结来说,synchronized 底层原理是通过对象的监视器实现线程之间的同步。它确保了同一时刻只有一个线程能够获取到,并且其他线程需要等待的释放才能继续执行。这样可以有效地保护共享资源,避免多个线程同时对共享资源进行修改导致的数据不一致性和不可预测性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值