目录
乐观锁
乐观锁的情况就跟名字一样,该进程会十分乐观,乐观地认为别的进程不会和自己同时修改数据,因此乐观锁默认是不会上锁的,只有在执行更新的时候才会去判断在此期间别人是否修改了数据,如果别人修改了数据则放弃操作,否则执行操作。
实现方式
从上面的定义我们可以发现,乐观锁的实现方式和CAS是一致的,事实上乐观锁的实现方式之一就是使用CAS,另一种实现方式也是基于CAS的版本号控制,为了避免CAS机制的ABA问题(CAS机制和ABA问题在另一篇博客中有详细说明,再次不多描述。)
悲观锁
悲观锁,顾名思义,会很悲观地认为在自己修改数据的时候,一定会有另一个进程去修改该数据,因此悲观锁在操作数据的时候会直接把数据上锁,禁止其他进程操作该数据,只有在操作结束后才会解锁。
实现方式
悲观锁的实现方式也就是加锁,加锁既可以在代码层面(比如Java中的synchronized关键字),也可以在数据库层面(比如MySQL中的排他锁)。
总结
读取频繁使用乐观锁,写入频繁使用悲观锁。
因为读取的时候不对数据产生影响,因此不需要担心数据冲突等问题,可以采取乐观锁;
但在写入的时候可能会出现多个线程同时操作的问题,需要使用悲观锁来进行数据锁定,防止冲突。