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

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

相关推荐
cyforkk6 小时前
Spring 异常处理器:从混乱到有序,优雅处理所有异常
java·后端·spring·mvc
生擒小朵拉6 小时前
STM32添加库函数
java·javascript·stm32
Z_z在努力6 小时前
【杂类】Spring 自动装配原理
java·spring·mybatis
小小菜鸡ing6 小时前
pymysql
java·服务器·数据库
getapi6 小时前
shareId 的产生与传递链路
java
我没想到原来他们都是一堆坏人7 小时前
(未完待续...)如何编写一个用于构建python web项目镜像的dockerfile文件
java·前端·python
沙二原住民7 小时前
提升数据库性能的秘密武器:深入解析慢查询、连接池与Druid监控
java·数据库·oracle
Jerry&Grj8 小时前
SpringBoot埋点功能技术实现方案深度解析:架构设计、性能优化与扩展性实践
java·微服务·性能优化·springboot·架构设计·埋点技术
没有bug.的程序员8 小时前
Redis Stream:轻量级消息队列深度解析
java·数据库·chrome·redis·消息队列
用户8160791833338 小时前
告别“魔法”:包你解决 Gradle 的下载慢问题
java