1. 乐观锁的定义
乐观锁顾名思义就是在操作时很乐观,认为操作不会产生并发问题(不会有其余线程对数据进行批改),因而不会上锁。然而在更新时会判断其余线程在这之前有没有对数据进行批改,个别会应用版本号机制
或CAS(compare and swap)算法
实现。
2. 乐观锁的实现
2.1 版本号机制
eg:
- 我创立了一个表格,主动生成参数version = 1;
- 而后我更新一次表格,version主动 = 2;
- 这时两个线程A,B同时要拜访并更新version = 2的表格:
- 线程1先更新,此时会
判断
version = 2并执行更新。更新完后version = 3,而后线程2更新; - 线程2先
判断
表格的version,发现version = 3,所以更新失败,只有version < 3(预期值)能力更新胜利。
2.2 CAS算法
同样是上述例子,线程2对所需批改字段的预期原值为“123”,后果发现该字段的理论原值=“321”(线程1更改的),所以不更新。只有预期原值 == 理论原值
时才更新胜利。
3. 乐观锁
3.1 定义
假如最坏的状况,每次取数据时都认为其余线程会批改,所以都会加(乐观)锁。一旦加锁,不同线程同时执行时,只能有一个线程执行,其余的线程在入口处期待,直到锁被开释。
3.2 实现
MySQL的行锁,表锁
Java的synchronized关键字等。