乐观锁和悲观锁
作者:互联网
乐观锁和悲观锁
乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。
Java中synchronized关键字和Lock的实现类是悲观锁,线程一旦得到锁,其他需要锁的线程就挂起的情况就是悲观锁。
这种锁会让没有得到锁资源的线程进入阻塞状态,而后在争夺到锁资源后恢复为运行状态,这个过程中涉及到操作系统用户模式和内核模式的转换,代价比较高。
乐观锁在Java中是通过使用无锁编程来实现,最常采用的是CAS算法,Java原子类中的递增操作就通过CAS自旋实现的。每次不加锁而是假设没有冲突而去完成某项操作,如果因为冲突失败就重试,直到成功为止。
CAS机制
CAS机制当中使用了3个基本操作数:内存地址V,预期值A,要修改的新值B。更新一个变量的时候,只有当变量的预期值A和内存地址V当中的实际值相同时,才会将内存地址V对应的值修改为B。如果不同,说明有别的线程进行了操作,则要更新预期值,循环执行直到成功(自旋)。
CAS机制的缺点:
1.CPU开销较大。在并发量比较高的情况下,如果许多线程反复尝试更新某一个变量,却又一直更新不成功,循环往复,会给CPU带来很大的压力。
2.不能保证代码块的原子性。CAS机制所保证的只是一个变量的原子性操作,只能实现变量同步,要保证整个代码块的同步还是需要使用Synchronized。
- 悲观锁适合写操作多的场景,先加锁可以保证写操作时数据正确。
- 乐观锁适合读操作多的场景,不加锁的特点能够使其读操作的性能大幅提升。
标签:加锁,Java,CAS,乐观,线程,悲观,操作 来源: https://www.cnblogs.com/maomao777/p/16515352.html