乐趣区

关于java:乐观锁与悲观锁

1. 乐观锁的定义

乐观锁顾名思义就是在操作时很乐观,认为操作不会产生并发问题 (不会有其余线程对数据进行批改),因而不会上锁。然而在更新时会判断其余线程在这之前有没有对数据进行批改,个别会应用 版本号机制 CAS(compare and swap)算法 实现。

2. 乐观锁的实现

2.1 版本号机制

eg:

  1. 我创立了一个表格,主动生成参数 version = 1;
  2. 而后我更新一次表格,version 主动 = 2;
  3. 这时两个线程 A,B 同时要拜访并更新 version = 2 的表格:
  4. 线程 1 先更新,此时会 判断version = 2 并执行更新。更新完后 version = 3,而后线程 2 更新;
  5. 线程 2 先 判断 表格的 version,发现 version = 3,所以更新失败,只有 version < 3(预期值)能力更新胜利。

2.2 CAS 算法

同样是上述例子,线程 2 对所需批改字段的预期原值为“123”,后果发现该字段的理论原值 =“321”(线程 1 更改的),所以不更新。只有 预期原值 == 理论原值 时才更新胜利。

3. 乐观锁

3.1 定义

假如最坏的状况,每次取数据时都认为其余线程会批改,所以都会加(乐观)锁。一旦加锁,不同线程同时执行时, 只能有一个线程执行,其余的线程在入口处期待,直到锁被开释。

3.2 实现

MySQL 的行锁,表锁
Java 的 synchronized 关键字等。

退出移动版