Java:乐观锁与悲观锁

1. 乐观锁

1.1 定义

总是认为不会产生并发安全问题,每次读取数据的时候总认为不会有其他线程对数据进行修改,因此不会上锁。但在更新操作时,会判断其他线程在这之前有没有并发线程对数据进行修改

1.2 实现方式:

版本号(version)方式:
一般是在数据表中加上一个数据版本号version字段,以此表示数据被修改的次数,当数据被修改时,version值进行变化(自增)。当线程更新数据时,读取数据的同时也会读取当前version的值,在提交更新时,需要判断刚才读取到的version的值与当前version的值相等时才会更新成功。
CAS算法:
Compae And Swap,比较与交换,一种无锁算法,即在不使用锁的情况下实现多线程之间的变量同步,也就是在没有线程被阻塞的情况下实现变量的同步,也叫非阻塞式同步

  • 需要读写的内存值 V
  • 进行比较的值 A
  • 拟写入的新值 B

当且仅当 V 的值等于 A时,CAS通过原子方式用新值B来更新V的值,否则不会执行任何操作(比较和替换是一个原子操作)。一般情况下是一个自旋操作,即不断的重试

1.3 适用场景

适用写比较少的情况,即多读的情况下,可以省去锁的开销

2.悲观锁

2.1 定义

总是假设最坏的并发安全情况,认为每次读取数据时其他线程会进行修改,所以都会加锁(读锁,写锁,行锁等)来保证线程安全,当其他线程想要访问数据时,都需要阻塞挂起

2.2 实现方式

行锁,表锁等,读锁,写锁等
synchronized
ReentrantLock

2.3 适用场景

多写的场景下,用悲观锁保证线程安全

猜你喜欢

转载自blog.csdn.net/xueguchen/article/details/108063583
今日推荐