面试突击:Synchronized底层是如何实现的?(面试必知:Synchronized底层实现原理详解)

原创
ithorizon 6个月前 (10-20) 阅读数 19 #后端开发

Synchronized底层实现原理详解

一、Synchronized简介

Synchronized是Java中的一个关键字,用于实现线程同步,即在多线程环境中控制对共享资源的访问。它可以保证在同一时刻,只有一个线程可以执行某个方法或代码块,从而防止多个线程同时访问共享资源而引发的数据不一致问题。

二、Synchronized底层实现

Synchronized的底层实现关键依赖性于Java虚拟机(JVM)的内置锁机制。在JVM中,Synchronized的实现涉及到以下几个关键概念:

  • Monitor对象
  • 偏向锁
  • 轻量级锁
  • 自旋锁
  • 质量锁

三、Monitor对象

Monitor对象是JVM中用于实现Synchronized的关键数据结构,每个Java对象都可以作为Monitor。Monitor可以领会为一个同步的锁池,包含以下三个基本操作:

  • monitorenter:当线程进入一个Synchronized方法或代码块时,会尝试获取Monitor对象对应的锁。
  • monitorexit:当线程退出Synchronized方法或代码块时,会释放Monitor对象对应的锁。
  • wait:线程在Monitor对象上调用wait()方法,会释放锁并进入等待状态。

四、偏向锁

偏向锁是JVM对Synchronized的一种优化,其核心思想是假设锁关键被一个线程持有。当锁被一个线程访问时,JVM会记录锁的拥有者,后续该线程再次访问锁时,可以直接获得,无需再次进行锁竞争。

偏向锁的开启和关闭可以通过JVM参数进行配置:

-XX:+UseBiasedLocking:开启偏向锁

-XX:-UseBiasedLocking:关闭偏向锁

五、轻量级锁

轻量级锁是JVM对Synchronized的另一种优化,当没有竞争时,通过CAS操作避免使用重量级的操作系统互斥量。轻量级锁的核心思想是,当锁处于无竞争状态时,通过CAS操作和指向当前线程的指针来控制锁的状态。

轻量级锁的开启和关闭可以通过JVM参数进行配置:

-XX:+UseLightLocking:开启轻量级锁

-XX:-UseLightLocking:关闭轻量级锁

六、自旋锁

自旋锁是轻量级锁的一种特殊形式,当线程尝试获取轻量级锁时,如果锁已经被其他线程持有,线程会循环检查锁是否可用,而不是立即阻塞。这样可以降低线程状态切换的开销,减成本时间性能。

七、质量锁

质量锁是JVM对轻量级锁的进一步优化,当轻量级锁竞争激烈时,会升级为质量锁。质量锁通过使用额外的Monitor对象来避免多个线程在同一个锁上的自旋,从而降低CPU的功耗。

八、总结

Synchronized是Java中实现线程同步的重要手段,其底层实现涉及到Monitor对象、偏向锁、轻量级锁、自旋锁和质量锁等多种机制。JVM通过这些机制,在不同场景下对Synchronized进行优化,以减成本时间程序的并发性能。

了解Synchronized的底层实现原理,有助于我们更好地使用它来控制线程同步,避免死锁、饥饿等问题,从而减成本时间程序的整体性能。


本文由IT视界版权所有,禁止未经同意的情况下转发

文章标签: 后端开发


热门