AQS(AbstractQueuedSynchronizer)是Java并发包中非常重要的一个基础组件,它是一种用于构建锁和其他同步工具的框架。AQS是一个基于FIFO等待队列实现的锁和同步器的框架,提供了一种相对简单却非常强大的方式来实现阻塞锁和相关同步器。 AQS的核心原理是通过一个双向队列来实现线程的排队等待,当一个线程获取锁失败时,会将该线程以及等待状态放入等待队列中,而后等待队列中的线程会按照先进先出的顺序逐个被唤醒,直到某个线程获取到锁为止。 在Java中,synchronize锁可以分为偏向锁、轻量级锁和重量级锁三种。其中,偏向锁和轻量级锁都是乐观锁,重量级锁则是悲观锁。当多个线程竞争同一把锁时,JVM会先尝试使用偏向锁或轻量级锁来提高效率,如果这两种方式都无法满足需求,那么JVM就会升级到重量级锁。 在synchronize锁升级过程中,JVM会首先尝试使用偏向锁。当第一个线程请求锁时,JVM会将锁的持有线程设置为该线程,并且在对象头中存储该线程的ID。当后续的线程请求锁时,JVM会先检查对象头中的ID是否为当前线程,如果是,则说明该线程已经持有锁,可以直接获取锁。如果不是,则说明该对象已经有线程持有锁了,那么JVM就会放弃偏向锁并升级到轻量级锁。 在轻量级锁的情况下,JVM会在对象头中存储锁记录指针,并且使用CAS(Compare And Swap)操作来尝试获取锁。如果CAS操作成功,则说明该线程获取到了锁,可以直接执行同步代码块。如果CAS操作失败,则说明该对象已经被多个线程持有锁了,那么JVM就会将锁升级到重量级锁。 在重量级锁的情况下,JVM会将所有等待该锁的线程加入到等待队列中,并且释放锁的持有线程。等待队列中的线程将不断尝试获取锁,直到获取到锁为止。由于重量级锁的实现方式是基于操作系统的底层锁机制,所以效率较低,仅适合于多个线程长时间等待的情况下使用。 总之
点赞 评论

相关推荐

牛客网
牛客企业服务