乐观锁和悲观锁

乐观锁

认为同一时间访问共享资源的线程不会冲突,所以采用共享资源的状态对资源进行修改。CAS操作也是乐观锁的体现。适合读多写少的操作。效率较高。

乐观锁的实现方式:

1、使用version方式,版本号控制对数据的操作

2、JDK的CAS操作就是乐观锁的一种实现。但是CAS可能会出现“ABA”的问题。

“ABA”问题:

CAS操作表示compareAndSet,提供了三个参数,旧值V,预期值E,更新值U,当V和E相等时,才会对数据进行操作。但是操作时可能出现了其他线程对数据操作的情况:A --> B -->A,其他线程将数据改为B后又改回成A。所以前面的线程会对数据操作成功。类似于数据库的脏读问题 。

如何解决“ABA”问题

采用version版本号控制,操作一次版本号version增加1,后续操作时带上参数version。版本号一直才会对数据操作。

悲观锁

认为同一时间一定会有多个线程访问同一静态资源,所以采用对共享资源加锁的方式保证数据的安全性,如数据库操作的for update操作。