Java中的锁

本文详细介绍了Java中的锁机制,包括乐观锁和悲观锁的区别,公平锁与非公平锁的原理,以及自旋锁、可重入锁、读写锁、共享/独占锁、重量级/轻量级锁和偏向锁的应用。此外,还讨论了分段锁的概念。
摘要由CSDN通过智能技术生成

Java中的锁用于保证线程在多并发情况下数据的一致性,可以在使用对象和调用方法之前加锁,保证同一时间只有一个线程持有对象的锁,从而保障数据的安全。

锁从乐观和悲观的角度可以分为乐观锁和悲观锁,从获取资源的公平性角度可以分为公平锁和非公平锁,资源是否共享可以分为共享锁和独占锁,从锁的状态可以分为偏向锁、轻量级锁和重量级锁。同时,在JVM中还设计了自旋锁来更好的利用CPU。

一、乐观锁&悲观锁

①乐观锁读取数据时认为别人不会修改该数据(不加锁),更新数据时判断在此期间别人是否更新该数据(读取当前版本号然后加锁)。具体流程为:读取当前版本号与上次版本号比较,若一致则更新,否则重复进行读、比较、写操作。Java中的乐观锁大部分是通过CAS(Compare and Swap)操作实现的。

②悲观锁每次读取数据都认为别人会修改数据(加锁),别人想读此数据时会阻塞。Java中的悲观锁大部分基于AQS(Abstract Queued Synchronized)架构实现。AQS定义了一套多线程访问共享资源的同步框架,许多同步类的实现都依赖于它。

二、自旋锁

思路:如果持有锁的线程能在很短的时间内释放锁资源,等待竞争锁的线程就不需要做内核态和用户态之间的切换进入阻塞、挂起状态,只需自旋(等待持有锁的线程释放锁后可立即获取锁,从而避免用户线程在用户态和内核态之间的频繁切换而导致的时间消耗)

线程自旋会占用CPU,长时间获取不到锁会造成CPU的浪费,所以需要设定自选等待的最大时间,超出线程会退出自选模式并释放所持有的锁。

①自旋锁的优缺点

优点:减少CPU上下文的切换,对于占用锁时间非常短或锁竞争不激烈的代码块来说性能大幅提升

缺点:持有锁的线程占用锁时间过长或锁的竞争过于激烈时,会造成CPU资源的浪费。

②自旋锁的时间阈值

JDK的不同版本所采用的自选周期不同,JDK1.5为固定的时间,JDK1.6引入了适应性自旋锁(由上一次在同一个锁上的自选时间及锁的拥有者的状态来决定),可基本认为一个线程上下文切换的时间就是一个锁自旋的最佳时间。

三、可重入锁

也叫递归锁,指在同一线程中外层函数获取到该锁之后,内层的递归函数仍然可以继续获取该锁。Java中的ReentrantLock和synchronized都是可重入锁。

四、公平锁和非公平锁

①公平锁:指在分配锁前检查是否有线程在排队等待获取该锁,优先将锁分配给排队时间最长的线程。

②非公平锁:指在分配锁时不考虑线程排队等待的情况,直接尝试获取锁,在获取不到锁时再排到队尾等待。

分析:公平锁需要在多线程的情况下需要多维护一个锁线程等待队列,基于该队列进行锁的分配,因此与非公平锁相比效率低很多。Java中的synchronized是非公平锁,ReentrantLock默认默认的lock方法采用的是非公平锁。

五、读写锁

区分读锁和写锁,多个读锁不互斥,读锁和写锁互斥。在读的地方使用读锁,写的地方使用写锁,在没有写锁的情况下,读是无阻塞的。

六、共享锁和独占锁

①独占锁(互斥锁,悲观):每次只允许一个线程持有该锁,ReentrantLock为独占锁的实现。

②共享锁(乐观):允许多个线程同时获取该锁,并发访问资源。ReentrantReadWriteLock的读锁为共享锁的实现。

七、重量级锁和轻量级锁

①重量级锁:基于操作系统的互斥量(Mutex Lock)实现,会导致进程在用户态和内核态之间切换,开销较大。

②轻量级锁:核心设计是在没有多线程竞争的前提下,减少重量级锁的使用以提高系统性能,适用于线程交替执行同步代码块的情况(即互斥操作)

八、偏向锁

用于在某个线程获取某个锁之后消除这个线程锁重入的开销,主要目的是在同一个线程多次获取某个锁的情况下尽量减少轻量级锁的执行路径,提高锁的运行效率。

综上所述轻量级锁用于提高多个线程交替执行同步块时的性能,偏向锁则在某个线程交替执行同步代码块时进一步提高性能。

锁的状态共四种:无锁、偏向锁、轻量级锁和重量级锁。

九、分段锁

分段锁并非一种实际存在的锁,而是一种锁的设计思,用于将数据分段并在每个分段上都单独加锁,把锁进一步细粒度化,以提高并发效率。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值