多线程-锁

多线程-锁

在实际开发中,经常会出现多线程的情况,但是本人此前的工作中并不处于多线程的成产环境,并未对多线程的处理有很多理解,因此特此写下文章记录对于多线程处理的学习。

悲观锁

见名之意,悲观锁就是用悲观的态度对待可能发生的数据冲突,即假设每一次对数据的修改操作都会发生冲突,所以每一次修改数据前都会将数据锁住,直到释放锁以后其他人才能操作。可以完全保证数据的独占性和正确性,但是性能低。是阻塞的

乐观锁

乐观锁就是假设数据冲突的频率不高,不会对操作的数据加锁,只有到数据提交的时候才去验证数据是否冲突,即判断新值和旧值是否相等,相等则不冲突,但是可能发生ABA问题,即线程1取出数据为A,线程2取出数据也为A,然后线系2对数据进行操作修改为B,再进行操作修改为A,此时线程1继续对数据进行操作,仍然会成功,解决办法可以增加一个版本号进行验证,通过版本号加旧值进行验证。是非阻塞的

分布式锁

在分布式系统架构上,传统的单机应用加锁就会失效了。因为可能会在多台服务器创建多个对象,每个对象都能获取到自己的锁。此时就需要分布式锁了。
分布式锁有如下3种方法:

  1. 数据库实现。即创建一个表,表中包含方法名等字段,并在方法名字段创建唯一索引,需要执行某个方法时,就使用这个方法名向表中插入数据,成功插入则获取锁,执行完成后删除对应的行数据释放锁。
  2. 基于缓存(Redis等)实现分布式锁。主要需要用到的命令:SETNX、expire、delete。利用Jedis。
  3. redisson实现。相对于Jedis而言,Redisson更强大。它里面也实现了分布式锁,而且包含多种类型的锁。

参考文章:

  1. https://www.cnblogs.com/liuqingzheng/p/11080501.html
  2. https://www.jianshu.com/p/47fd7f86c848
  • 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!

请我喝杯咖啡吧~

支付宝
微信