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

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

相关推荐
陈大爷(有低保)9 分钟前
UDP Socket聊天室(Java)
java·网络协议·udp
kinlon.liu22 分钟前
零信任安全架构--持续验证
java·安全·安全架构·mfa·持续验证
王哲晓43 分钟前
Linux通过yum安装Docker
java·linux·docker
java6666688881 小时前
如何在Java中实现高效的对象映射:Dozer与MapStruct的比较与优化
java·开发语言
Violet永存1 小时前
源码分析:LinkedList
java·开发语言
执键行天涯1 小时前
【经验帖】JAVA中同方法,两次调用Mybatis,一次更新,一次查询,同一事务,第一次修改对第二次的可见性如何
java·数据库·mybatis
Jarlen1 小时前
将本地离线Jar包上传到Maven远程私库上,供项目编译使用
java·maven·jar
蓑 羽1 小时前
力扣438 找到字符串中所有字母异位词 Java版本
java·算法·leetcode
Reese_Cool1 小时前
【C语言二级考试】循环结构设计
android·java·c语言·开发语言