Java中常见锁的分类及概念分析

简介: Java中常见锁的分类及概念分析

基于线程对同一把锁的获取情况分类


  • 可重入锁

同一个线程可以多次获取锁

每次获取锁,锁的计数器加1,每次释放锁锁的计数器减1

锁的计数器归零,锁完全释放

Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是可重入锁。


不可重入锁

同一个线程不可以多次获取锁,必须等待锁释放才能再次获取


基于对共享资源的访问策略

  • 乐观锁

当线程获取不到资源,让cpu再次调用重新获取锁资源

Atomic原子性类中,就是基于CAS乐观锁实现的。

  • 悲观锁

当前线程获取不到锁资源,线程会被挂起进入(BLOCKED、WATING)状态,于此同时线程的挂起会涉及用户态与内核态的切换,消耗资源

用户态:JVM自己执行指令,不需要CPU调度

内核态:JVM不能自己执行,需要操作系统调度

Java中提供的synchronized,ReentrantLock,ReentrantReadWriteLock都是悲观锁。


根据线程获取锁的先后顺序

  • 公平锁

线程获取锁的顺序和你来的顺序一致,先到先得。

  • 非公平锁

线程获取锁的时候可以使用竞争的方式,竞争失败也排队获取

Java中提供的synchronized只能是非公平锁。


Java中提供的ReentrantLock,ReentrantReadWriteLock可以实现公平锁和非公平锁


根据锁被线程资源占有的数量

  • 互斥锁

同一时刻,只有一个线程可以拥有这把锁

Java中提供的synchronized、ReentrantLock是互斥锁。

一般上写的业务场景

  • 共享锁

同一个时刻,一把锁可以被多个线程资源共享

一般读的业务场景


Java中提供的ReentrantReadWriteLock,有互斥锁也有共享锁。


如果您觉得我所提供的信息对您有帮助,欢迎您点赞、收藏和评论。如果您想要更深入的交流,您可以添加我的微信号,或者关注我的微信公众号。您的支持和鼓励是我持续写作的动力,我期待与您互动并提供更多有价值的信息。


目录
相关文章
|
1天前
|
安全 Java 编译器
【Java EE】总结12种锁策略以及synchronized的实现原理
【Java EE】总结12种锁策略以及synchronized的实现原理
|
2天前
|
Java
【专栏】Java 中的锁是什么意思,有哪些分类?
【4月更文挑战第28天】Java多线程中,锁用于控制共享资源访问,确保数据一致性和正确性。本文探讨锁的概念、作用及分类:乐观锁与悲观锁、自旋锁与适应性自旋锁、公平锁与非公平锁、可重入锁和读写锁。使用锁需注意避免死锁、合理选择锁粒度及性能优化。理解锁有助于提升多线程编程的效率和稳定性。
|
3天前
|
监控 Java API
Java 模块化设计:概念与实战应用
【4月更文挑战第27天】模块化设计是现代软件开发的关键,它帮助开发者构建可管理、可维护的大型系统。Java 平台的模块化支持始于 Java 9,引入了一种全新的模块系统。
12 3
|
3天前
|
设计模式 算法 Java
Java 设计模式:探索策略模式的概念和实战应用
【4月更文挑战第27天】策略模式是一种行为设计模式,它允许在运行时选择算法的行为。在 Java 中,策略模式通过定义一系列的算法,并将每一个算法封装起来,并使它们可以互换,这样算法的变化不会影响到使用算法的客户。
9 1
|
3天前
|
Java 程序员
Java 异步编程:概念、优势与实战示例
【4月更文挑战第27天】在现代软件开发中,异步编程是一种重要的编程范式,特别适用于处理长时间运行的任务,如网络通信、文件操作等。
11 0
|
3天前
|
Java 数据处理 API
Java 函数式编程:概念、优势与实战示例
【4月更文挑战第27天】函数式编程(Functional Programming,简称 FP)是一种编程范式,它将计算视为数学函数的求值并避免使用程序状态以及可变数据。
9 1
|
3天前
|
Java Shell API
Java 模块化编程:概念、优势与实战指南
【4月更文挑战第27天】Java 模块化编程是 Java 9 中引入的一项重大特性,通过 Java Platform Module System (JPMS) 实现。模块化旨在解决 Java 应用的封装性、可维护性和性能问题
9 0
|
3天前
|
安全 Java
【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁
【JAVA】Java8开始ConcurrentHashMap,为什么舍弃分段锁
|
6天前
|
Dubbo Java 应用服务中间件
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
Java从入门到精通:3.2.2分布式与并发编程——了解分布式系统的基本概念,学习使用Dubbo、Spring Cloud等分布式框架
|
11天前
|
存储 Java 数据库连接
java DDD 领域驱动设计思想的概念与实战
【4月更文挑战第19天】在Java开发中,领域驱动设计(Domain-Driven Design, DDD) 是一种软件设计方法论,强调以领域模型为中心的软件开发。这种方法通过丰富的领域模型来捕捉业务领域的复杂性,并通过软件满足核心业务需求。领域驱动设计不仅是一种技术策略,而且还是一种与业务专家紧密合作的思维方式
38 2