当前位置: 首页 > news >正文

java锁底层概述

Java中的锁是并发编程中核心的同步机制之一,用于控制多个线程对共享资源的访问,以保证数据的一致性和完整性。Java锁的底层实现依赖于操作系统的原生线程模型和Java虚拟机(JVM)的实现。这里主要讨论两种常见的锁:synchronized关键字和**java.util.concurrent.locks包中的锁**,如ReentrantLock

synchronized关键字

synchronized是Java中实现同步的一个基本构建块。它可以用于方法或者代码块上,保证同一时刻只有一个线程可以执行synchronized修饰的方法或代码块。

  • 对象锁:当synchronized修饰实例方法或代码块时,它锁定的是调用这个方法的对象。
  • 类锁:当synchronized修饰静态方法或代码块时,它锁定的是这个类的Class对象。

底层实现

  • 轻量级锁:当线程初次进入同步块时,JVM会尝试使用轻量级锁的机制来避免操作系统的互斥量开销。这是通过在对象头上的锁记录(Mark Word)中存储锁指针来实现的。如果没有竞争,这种方式效率很高。
  • 重量级锁:当有多个线程竞争同一把锁时,轻量级锁会膨胀为重量级锁,此时锁的控制权交给操作系统,通过操作系统的互斥量(Mutex)来实现线程间的同步。
  • 偏向锁:偏向锁是一种锁优化手段,它假设锁总是由同一个线程多次获得,通过在对象头标记线程ID来避免锁的竞争。

java.util.concurrent.locks包中的锁

ReentrantLockjava.util.concurrent.locks包中提供的一个重入锁,提供比synchronized更丰富的功能,如尝试非阻塞获取锁、可中断的锁获取等。

底层实现

  • AQS(AbstractQueuedSynchronizer):ReentrantLock的实现基于AQS框架。AQS使用一个int成员变量表示同步状态,通过内置的FIFO队列来管理获取同步状态失败的线程。
  • 锁状态:AQS内部通过volatile变量维护锁的状态,保证状态的可见性。线程的阻塞和唤醒通过LockSupport.park()LockSupport.unpark(Thread)实现。
  • 公平锁与非公平锁:ReentrantLock可以是公平的或非公平的。公平锁意味着等待时间最长的线程会优先获取锁。非公平锁则允许插队,可能会造成某些线程永远获取不到锁(饥饿)。

总结

Java中的锁机制主要通过synchronized关键字和java.util.concurrent.locks包中的类来实现。synchronized依靠JVM内部机制和操作系统原生支持来实现同步,而java.util.concurrent.locks提供了更灵活的锁机制,其实现基于AQS框架。两种锁机制都是Java并发编程中不可或缺的工具,选择哪一种取决于具体需求和使用场景。

http://www.lryc.cn/news/309194.html

相关文章:

  • win10如何添加指纹登陆
  • 足底筋膜炎的症状及治疗
  • udp丢包问题研究
  • 在idea中用模板骨架初始创建maven管理的web项目时没有src有关的目录的解决方案
  • WPF 【十月的寒流】学习笔记(2):MVVM中是怎么实现通知的
  • 数据结构:广义表
  • 你好,C++(18) 到底要不要买这个西瓜?4.1.6 操作符之间的优先顺序
  • C语言 for 循环语句的基本格式是什么?
  • 项目-SERVER模块-日志宏
  • TCP为什么要三次握手?
  • 网络防御第6次作业
  • Jmeter分布式部署
  • Odoo迈入开源第一低代码开发平台的重要里程碑
  • WinForm、Wpf自动升级 AutoUpdater.NET
  • GPU不够用:语言模型的分布式挑战
  • 深入理解Redis中的渐进式Rehash技术
  • 数据结构 栈和队列 力扣例题AC——代码以及思路记录
  • 管理类联考--复试--英文面试--各校英文面试内容
  • Android修行手册-Chaquopy中opencv、numpy的初步应用
  • VBA将当前打开的表格生成PDF图片
  • 解锁AI大模型秘籍:未来科技的前沿探索
  • 一文带你了解MySQL之B+树索引的原理
  • 【Vue】npm run build 打包报错:请在[.env.local]中填入key后方可使用...
  • 中国电子学会2020年06月真题C语言软件编程等级考试三级(含详细解析答案)
  • WPF的DataGrid自动生成中文列头
  • CSS【详解】居中对齐 (水平居中 vs 垂直居中)
  • 【排序算法】基数排序
  • 解释存储过程和函数的区别,以及它们在MySQL中的用途。如何创建和使用存储过程和函数?
  • 【GPU驱动开发】-GPU架构简介
  • m位数问题(c++题解)