多线程学习——锁的分类(待更新)

来源:互联网 发布:mac 移动硬盘 ntfs 编辑:程序博客网 时间:2024/06/12 20:45
  1. 乐观锁:乐观锁严格来说算是一种加锁策略,大致的思路是通过一个版本号或者时间戳之类的标识来控制数据更新的成功和失败。首先读取出带版本号或者时间戳的数据,然后通过版本号或者时间戳匹配数据,最后在更新数据的同时对版本号自增或者时间戳自增来实现乐观锁。如果读取的数据已经发生改变,则这个更新会由于版本号或者时间戳的改变而失败,反之则是会成功且版本号或者时间戳发生了改变。
    PS:Zookeeper中的节点数据更新就是使用乐观锁的策略

  2. 悲观锁:悲观锁也是一种加锁策略,它的策略与乐观锁相反。悲观锁是在整个数据的处理过程中,会将数据进行锁定,只有在整个处理完成之后才允许其他处理流程(排它性)。

  3. 排它锁:排它锁是基于悲观锁的加锁策略,排它锁又称为写锁(exclusive lock,简记为X锁)。最常见的排它锁出现在数据库中。

    若事务T对数据对象A加上X锁,则只允许T读取和修改A,其它任何事务都不能再对A加任何类型的锁,直到T释放A上的锁。它防止任何其它事务获取资源上的锁,直到在事务的末尾将资源上的原始锁释放为止。在更新操作(INSERT、UPDATE 或 DELETE)过程中始终应用排它锁。
    PS:引用来源于百度百科,java.util.concurrent.locks.ReentrantLocksynchronized就是基于排它锁

  4. 共享锁:共享锁又称为读锁(share lock,简记为S锁)

    若事务T对数据对象A加上S锁,则其它事务只能再对A加S锁,而不能加X锁,直到T释放A上的S锁。
    PS:引用来源于百度百科,java.util.concurrent.CountDownLatch就是基于共享锁

  5. 可重入锁可重入锁也叫递归锁指的是同一个线程可以多次获取同一个锁而不会产生死锁。

    指的是同一线程 外层函数获得锁之后 ,内层递归函数仍然有获取该锁的代码,但不受影响。
    PS:引用来源于并发编程网-Java锁的种类以及辨析(四):可重入锁

原创粉丝点击