悲观锁和乐观锁在不同的 语言中都有体现,这里我们来说Java中悲观锁和乐观锁的实现。
首先说说什么是悲观锁,什么是乐观锁。顾名思义悲观锁,就是悲观,当许多线程要同时操作同一目标代码时,只有一个线程能操作,其他线程只能等待。 而乐观锁,也就和悲观锁相反。所有线程都可以对目标代码进行操作。但在进行更改数据的操作时会进行校验,有无更改过
在Java中,synchronized和lock就是典型的悲观锁的实现。当其中一个线程得到锁时,其他线程将会阻塞。这种锁会让没有得到锁资源的线程,线程切换为阻塞状态,在之后如有线程抢到锁,将又会变为可运行状态,这种线程状态的切换,性能代价较高。
乐观锁在Java中是通过使用无锁编程来实现。其中最长采用的就是cas算法来实现。Java中的automatic原子类,中有compareAndSet方法进一步封装了compareAndSwap方法。
cas机制当中使用了三个基本参数,v(需要被修改的值的地址),a(修改前的值(预期值)),b(修改后的值)。只有当a中的预期值,与v中的实际值相等时,才会进行对v地址中的值修改为b。如果成功则返回true。否则返回false。
乐观锁适合读多的场景,悲观锁适合写多的场景
本文使用 文章同步助手 同步