乐观锁与悲观锁

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关键字等。

你可能感兴趣的:(java)