乐观锁(Optimistic Lock)
顾名思义,就是很乐观,当去更新共享数据时,是假定数据没有被别人修改,也就不需要加锁,并且会在更新的时候判断数据是否被修改,如果被修改的话,说明存在冲突,需要重头开始重试,直到成功为止。
在 Java
中可以使用 volatile+CAS
原语实现,带参数的版本可以避免 ABA
问题。
悲观锁(Pessimistic Lock)
顾名思义,就是很悲观,每次去更新共享数据时,都认为数据已经被别人修改,所以在每次在执行之前,都会对需要的数据进行加锁,这样别人需要更新数据时就必须进行等待。
在 Java
中可以使用 synchronized
及各类 Lock
锁实现。
总结
乐观锁适合用于读多写少这种竞争小的场景,避免了加锁带来的额外开销,如果外部环境竞争激烈,那么大量的线程都会处于重试状态,这反倒会导致系统性能的降低,这时候就需要考虑使用悲观锁了。
网友评论