zoukankan      html  css  js  c++  java
  • B7. Concurrent 锁的分类

    概述

      锁的分类根据不同的维度可以分为以下几种:

    • 悲观锁和乐观锁
    • 共享锁(S锁,读锁)和排他锁(X锁,写锁)
    • 公平锁和非公平锁
    • 重入锁
    • 分段锁

    悲观锁和乐观锁

      悲观锁和乐观锁是两种处理并发冲突的思路,不是指锁的具体实现。

      悲观锁总是假设会发生最坏的情况,认为一个事务每次读取数据时,别的事务总会修改该数据,所以每次读取数据的时候总需要加上锁。传统的关系型数据库里有很多用到悲观锁的地方:比如行锁、表锁、读锁(共享锁)、写锁(排他锁),Java 中的 synchronized 关键字和基于AQS(java.util.concurrent.locks.AbstractQueuedSynchronizer)实现的各种锁(ReentrantLock、ReentrantReadWriteLock 等)也是使用悲观锁的思想。

      乐观锁总是假设会发生最好的情况,认为一个事务每次读取数据时,别的事务不会修改该数据,所以采取是一种“无锁”的策略,但需要在更新的时候会去判断该数据有没有被修改(自旋操作)。乐观锁可以使用版本号机制和 CAS 算法(Compare-and-Swap)来实现。乐观锁适合读大于写的应用场景,可以提高并发效率,从而提高吞吐量。Java 中 java.util.concurrent.atomic 包下的原子变量类就是使用 CAS 算法实现的乐观锁。

    共享锁和排他锁

      共享锁和排他锁都会对数据进行加锁,都属于悲观锁。

      共享锁(S锁)也叫读锁,如果一个事务 T 对一个数据 A 加了共享锁,则其他事务可以对数据 A 加共享锁进行读操作,但其他事务不可以对数据 A 加排他锁进行写操作;

      排他锁(X锁)也叫写锁,如果一个事务 T 对一个数据 A 加了排他锁,则其他事务不可以对数据 A 加共享锁进行或者排他锁。

      数据库的增删改操作默认会加排他锁,查询操作不会加锁。

      Java 中的 java.util.concurrent.locks.ReentrantReadWriteLock 提供了一种读写锁的实现。

      进行读操作的时候进行加锁,可以防止 “脏读” 的情况。通俗地讲,加了读锁,事务在读取数据的时候,不允许其他事务对该数据进行修改。

    公平锁和非公平锁

      所谓的 “公平” 在于是否按照线程申请锁的顺序分配锁,如果是,则为 “公平锁”,否则为 “非公平锁”。

      java.util.concurrent.locks.ReentrantLock 和 java.util.concurrent.locks.ReentrantReadWriteLock 都提供了 “公平锁” 和 “非公平锁” 的构造器实现。无参构造器默认为 “非公平锁”。

      synchronized 关键字提供的是一种 “非公平锁”。

      实现 “公平锁” 需要使用队列实现 “FIFO”,增加了队列数据处理的开销,当队列数据较大时对性能影响较大。相对而言,“非公平锁” 具有更高的并发效率,吞吐量更大,如非必要优先选择 “非公平锁”。  

    重入锁

      重入锁又叫递归锁,指的是一个获得锁后在同步块中可以进入同一把锁控制的另一代码块中,而不需要先释放锁,只需把该线程对锁的数量加1。试想一下,如果该线程尝试进入同一把锁控制的另一代码块时,需要等待锁释放,原来代码块又在等待,导致锁一直无法被释放,造成 “死锁”。java.util.concurrent.locks.ReentrantLock 、 java.util.concurrent.locks.ReentrantReadWriteLock、synchronized 关键字都是 重入锁。

    分段锁

      分段锁是一种通过细化锁粒度来获取更高并发效能的锁优化的设计思想。

      分段锁的一个实现可以参考 java.util.concurrent.ConcurrentHashMap。

  • 相关阅读:
    【Java 学习笔记】 问题列表
    【Weka】Weka聚类
    【MFC 学习笔记】MFC BUG
    【Java 学习笔记】 变量转换
    【MFC 学习笔记】CheckListBox
    Http Handler 介绍
    C# HttpWebRequest可断点上传,下载文件;SOCKET多线程多管道可断点传送大文件
    SQL Server 2005 常用数据类型详解
    浅谈OCR之Tesseract
    [理财产品] 招行新的日日金8158
  • 原文地址:https://www.cnblogs.com/zlxyt/p/11094882.html
Copyright © 2011-2022 走看看