java各种锁有什么区别

Java 虚拟机(JVM)中有几种不同类型的锁,每种锁都有其特定的用途和性能特点。下面我将为你介绍几种常见的锁:

1.独占锁(也称为悲观锁):

1.synchronized:这是 Java 提供的一种内置的独占锁,它可以保证同一时刻只有一个线程可以访问同步块。synchronized 锁用于保护共享资源,避免多个线程同时访问导致数据不一致。它有两种作用域:一种是方法级别的,一种是代码块级别的。

2.ReentrantLock:这是 Java.util.concurrent.locks 包提供的一种独占锁,功能类似于 synchronized,但是提供了更多高级功能,如有条件的锁、公平锁等。

2.共享锁:

1.ReadWriteLock:这是一种特殊的锁,允许多个线程同时读取共享资源,但只有一个线程可以写入。这种锁适合于读多写少的场景。

3.乐观锁:

1.使用版本号:乐观锁通常不使用锁机制,而是通过版本号(或 CAS - Compare And Swap)来控制并发。当多个线程尝试更新同一个变量时,只有通过了 CAS 操作的线程才能成功更新变量,其他的线程则会被推迟,直到前面的线程更新完成。这种方式假设冲突很少发生,所以效率比较高。

4.无锁:

1.使用原子操作:Java 的 atomic 包提供了一系列的原子操作类,如 AtomicInteger, AtomicLong 等,它们通过 CAS 操作来保证操作的原子性,而不需要使用锁。

5.自旋锁:

1.当一个线程在等待另一个线程释放锁的时候,不会立即放弃 CPU,而是不断检查锁是否被释放,这样可以减少线程上下文切换的开销,提高效率。但是,如果锁被长时间持有,自旋锁可能会导致 CPU 资源浪费。

6.公平锁:

1.公平锁保证线程按照请求锁的顺序来获取锁,避免饥饿现象。

7.非公平锁:

1.非公平锁不保证线程获取锁的顺序,因此一个线程可能连续多次获得锁,也可能长时间得不到锁。

8.可中断锁:

1.可以响应中断的锁,当线程等待锁的时候,如果线程被中断,它可以选择退出。

9.锁消除:

1.JVM 会对一些同步块自动消除,即在某些情况下,如果检测到没有线程竞争,JVM 会消除同步块,使其变成非同步块,提高效率。

10.锁粗化:

1.如果一系列连续的操作天然地构成一个锁扩展,JVM 会把这些操作合并成一个大的同步块,减少锁的粒度。

11.轻量级锁:

1.当锁是闲置状态时,锁会膨胀为重量级锁,这是一种为了提高性能的做法。

12.偏向锁:

1.偏向锁是一种锁的优化策略,它试图将锁挂载到线程上,如果一个线程获得了锁,那么锁会偏向于该线程,不会立即膨胀为重量级锁。

每种锁适用于不同的场景,开发者可以根据实际情况选择合适的锁。需要注意的是,不当的使用锁可能会导致性能问题,如死锁、活锁、资源争用等问题,所以在使用锁的时候需要特别小心。

相关推荐
珹洺12 分钟前
Java-Spring入门指南(十一)代理模式与Spring AOP实战
java·spring·代理模式
JAVA学习通23 分钟前
微服务项目->在线oj系统(Java-Spring)--增删改
java·开发语言·spring
道可到30 分钟前
字节面试 Java 面试通关笔记 03| java 如何实现的动态加载(面试可复述版)
java·后端·面试
聪明的笨猪猪32 分钟前
Spring Boot & Spring Cloud高频面试清单(含通俗理解+生活案例)
java·经验分享·笔记·面试
LoveXming38 分钟前
Chapter9—享元模式
java·c++·设计模式·享元模式·开闭原则
聪明的笨猪猪1 小时前
Spring MVC高频面试清单(含通俗理解+生活案例)
java·经验分享·笔记·面试
失因1 小时前
Docker 容器与镜像
java·运维·spring cloud·docker·容器
双普拉斯1 小时前
Spring WebFlux调用生成式AI提供的stream流式接口,实现返回实时对话
java·vue.js·人工智能·后端·spring
Mr Aokey1 小时前
从零开始学RabbitMQ:Java实战简单模式与工作队列消息处理
java·rabbitmq
小葡萄20251 小时前
JAVA中的抽象类和抽象方法
java·开发语言