本章,我们介绍锁的架构;后面的章节将会对它们逐个进行分析介绍。目录如下:

  • 01. Java多线程系列--“JUC锁”01之 框架
  • 02. Java多线程系列--“JUC锁”02之 互斥锁ReentrantLock
  • 06. Java多线程系列--“JUC锁”03之 Condition条件
  • 07. Java多线程系列--“JUC锁”04之 LockSupport
  • 03. Java多线程系列--“JUC锁”05之 公平锁(上)
  • 04. Java多线程系列--“JUC锁”06之 公平锁(下)
  • 05. Java多线程系列--“JUC锁”07之 非公平锁
  • 08. Java多线程系列--“JUC锁”08之 共享锁和ReentrantReadWriteLock (待更新)
  • 09. Java多线程系列--“JUC锁”09之 CountDownLatch原理和示例(待更新)
  • 10. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例(待更新)
  • 11. Java多线程系列--“JUC锁”11之 Semaphore信号量的原理和示例(待更新)

根据锁的添加到Java中的时间,Java中的锁,可以分为"同步锁"和"JUC包中的锁"。

同步锁

  即通过synchronized关键字来进行同步,实现对竞争资源的互斥访问的锁。Java 1.0版本中就已经支持同步锁了。

  同步锁的原理是,对于每一个对象,有且仅有一个同步锁;不同的线程能共同访问该同步锁。但是,在同一个时间点,该同步锁能且只能被一个线程获取到。这样,获取到同步锁的线程就能进行CPU调度,从而在CPU上执行;而没有获取到同步锁的线程,必须进行等待,直到获取到同步锁之后才能继续运行。这就是,多线程通过同步锁进行同步的原理!

JUC包中的锁

  相比同步锁,JUC包中的锁的功能更加强大,它为锁提供了一个框架,该框架允许更灵活地使用锁,只是它的用法更难罢了。

  JUC包中的锁,包括:Lock接口,ReadWriteLock接口,LockSupport阻塞原语,Condition条件,AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer三个抽象类,ReentrantLock独占锁,ReentrantReadWriteLock读写锁。由于CountDownLatch,CyclicBarrier和Semaphore也是通过AQS来实现的;因此,我也将它们归纳到锁的框架中进行介绍。

  先看看锁的框架图,如下所示。

01. Lock接口

  JUC包中的 Lock 接口支持那些语义不同(重入、公平等)的锁规则。所谓语义不同,是指锁可是有"公平机制的锁"、"非公平机制的锁"、"可重入的锁"等等。"公平机制"是指"不同线程获取锁的机制是公平的",而"非公平机制"则是指"不同线程获取锁的机制是非公平的","可重入的锁"是指同一个锁能够被一个线程多次获取。

02. ReadWriteLock

  ReadWriteLock 接口以和Lock类似的方式定义了一些读取者可以共享而写入者独占的锁。JUC包只有一个类实现了该接口,即 ReentrantReadWriteLock,因为它适用于大部分的标准用法上下文。但程序员可以创建自己的、适用于非标准要求的实现。

03. AbstractOwnableSynchronizer/AbstractQueuedSynchronizer/AbstractQueuedLongSynchronizer
  AbstractQueuedSynchronizer就是被称之为AQS的类,它是一个非常有用的超类,可用来定义锁以及依赖于排队阻塞线程的其他同步器;ReentrantLock,ReentrantReadWriteLock,CountDownLatch,CyclicBarrier和Semaphore等这些类都是基于AQS类实现的。AbstractQueuedLongSynchronizer 类提供相同的功能但扩展了对同步状态的 64 位的支持。两者都扩展了类 AbstractOwnableSynchronizer(一个帮助记录当前保持独占同步的线程的简单类)。

04. LockSupport
  LockSupport提供“创建锁”和“其他同步类的基本线程阻塞原语”。 
  LockSupport的功能和"Thread中的Thread.suspend()和Thread.resume()有点类似",LockSupport中的park() 和 unpark() 的作用分别是阻塞线程和解除阻塞线程。但是park()和unpark()不会遇到“Thread.suspend 和 Thread.resume所可能引发的死锁”问题。

05. Condition
  Condition需要和Lock联合使用,它的作用是代替Object监视器方法,可以通过await(),signal()来休眠/唤醒线程。
Condition 接口描述了可能会与锁有关联的条件变量。这些变量在用法上与使用 Object.wait 访问的隐式监视器类似,但提供了更强大的功能。需要特别指出的是,单个 Lock 可能与多个 Condition 对象关联。为了避免兼容性问题,Condition 方法的名称与对应的 Object 版本中的不同。

  06. ReentrantLock
  ReentrantLock是独占锁。所谓独占锁,是指只能被独自占领,即同一个时间点只能被一个线程锁获取到的锁。ReentrantLock锁包括"公平的ReentrantLock"和"非公平的ReentrantLock"。"公平的ReentrantLock"是指"不同线程获取锁的机制是公平的",而"非公平的  ReentrantLock"则是指"不同线程获取锁的机制是非公平的",ReentrantLock是"可重入的锁"。
  ReentrantLock的UML类图如下:

  (01) ReentrantLock实现了Lock接口。
  (02) ReentrantLock中有一个成员变量sync,sync是Sync类型;Sync是一个抽象类,而且它继承于AQS。
  (03) ReentrantLock中有"公平锁类"FairSync和"非公平锁类"NonfairSync,它们都是Sync的子类。ReentrantLock中sync对象,是FairSync与NonfairSync中的一种,这也意味着ReentrantLock是"公平锁"或"非公平锁"中的一种,ReentrantLock默认是非公平锁。

07. ReentrantReadWriteLock
  ReentrantReadWriteLock是读写锁接口ReadWriteLock的实现类,它包括子类ReadLock和WriteLock。ReentrantLock是一种独占锁,而WriteLock是共享锁。
  ReentrantReadWriteLock的UML类图如下:


  (01) ReentrantReadWriteLock实现了ReadWriteLock接口。
  (02) ReentrantReadWriteLock中包含sync对象,读锁readerLock和写锁writerLock。读锁ReadLock和写锁WriteLock都实现了Lock接口。
  (03) 和"ReentrantLock"一样,sync是Sync类型;而且,Sync也是一个继承于AQS的抽象类。Sync也包括"公平锁"FairSync和"非公平锁"NonfairSync。

08. CountDownLatch
  CountDownLatch是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 
  CountDownLatch的UML类图如下:


  CountDownLatch包含了sync对象,sync是Sync类型。CountDownLatch的Sync是实例类,它继承于AQS。

09. CyclicBarrier
  CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。因为该 barrier 在释放等待线程后可以重用,所以称它为循环 的 barrier。
  CyclicBarrier的UML类图如下:


  CyclicBarrier是包含了"ReentrantLock对象lock"和"Condition对象trip",它是通过独占锁实现的。
  CyclicBarrier和CountDownLatch的区别是:
  (01) CountDownLatch的作用是允许1或N个线程等待其他线程完成执行;而CyclicBarrier则是允许N个线程相互等待。
  (02) CountDownLatch的计数器无法被重置;CyclicBarrier的计数器可以被重置后使用,因此它被称为是循环的barrier。

10. Semaphore
  Semaphore是一个计数信号量,它的本质是一个"共享锁"。
  信号量维护了一个信号量许可集。线程可以通过调用acquire()来获取信号量的许可;当信号量中有可用的许可时,线程能获取该许可;否则线程必须等待,直到有可用的许可为止。 线程可以通过release()来释放它所持有的信号量许可。
  Semaphore的UML类图如下:


  和"ReentrantLock"一样,Semaphore包含了sync对象,sync是Sync类型;而且,Sync也是一个继承于AQS的抽象类。Sync也包括"公平信号量"FairSync和"非公平信号量"NonfairSync。

转载于:https://www.cnblogs.com/Hermioner/p/9905470.html

Java多线程系列---“JUC锁”01之 框架相关推荐

  1. Java多线程系列--“JUC锁”03之 公平锁(一)

    概要 本章对"公平锁"的获取锁机制进行介绍(本文的公平锁指的是互斥锁的公平锁),内容包括: 基本概念 ReentrantLock数据结构 参考代码 获取公平锁(基于JDK1.7.0 ...

  2. Java多线程系列--“JUC锁”05之 非公平锁

    转载自:http://www.cnblogs.com/skywang12345/p/3496651.html点击打开链接 概要 前面两章分析了"公平锁的获取和释放机制",这一章开始 ...

  3. Java多线程系列--“JUC锁”07之 LockSupport

    LockSupport介绍 LockSupport是JDK中比较底层的类,用来创建锁和其他同步工具类的基本线程阻塞原语.java锁和同步器框架的核心 AQS: AbstractQueuedSynchr ...

  4. Java多线程系列--“JUC锁”10之 CyclicBarrier原理和示例

    CyclicBarrier简介 CyclicBarrier是一个同步辅助类,允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point).因为该 barrier 在释放等 ...

  5. Java多线程系列--“JUC原子类”01之 框架

    2019独角兽企业重金招聘Python工程师标准>>> Java多线程系列--"JUC原子类"01之 框架 根据修改的数据类型,可以将JUC包中的原子操作类可以分 ...

  6. Java多线程系列--“JUC线程池”06之 Callable和Future

    转载自  Java多线程系列--"JUC线程池"06之 Callable和Future Callable 和 Future 简介 Callable 和 Future 是比较有趣的一 ...

  7. Java多线程系列--“JUC原子类”03之 AtomicLongArray原子类

    概要 AtomicIntegerArray, AtomicLongArray, AtomicReferenceArray这3个数组类型的原子类的原理和用法相似.本章以AtomicLongArray对数 ...

  8. Java多线程系列 JUC线程池01 线程池框架

    转载  http://www.cnblogs.com/skywang12345/p/3509903.html 为什么引入Executor线程池框架 new Thread()的缺点 1. 每次new T ...

  9. Java多线程系列---“JUC原子类”02之 框架

    转自:http://www.cnblogs.com/skywang12345/p/3514589.html 根据修改的数据类型,可以将JUC包中的原子操作类可以分为4类. 1. 基本类型: Atomi ...

最新文章

  1. C#中的is和as操作符
  2. C++项目参考解答:累加求圆周率
  3. 【Linux】一步一步学Linux——perl命令(264)
  4. Java中的传值与传引用
  5. 安卓签名生成工具_ios app如何进行内测?ios app和安卓app的内测有何区别?
  6. 实践 Ubuntu 10.10/11.04 关闭双显卡问题
  7. UNIX/Linux 系统管理技术手册阅读(二)
  8. Python安装第三方包(setup.py)
  9. c语言半壁江山回调函数,回调函数运行时间太长影响了程序性能,怎么办
  10. php tcp获取数据_php建立tcp服务请求数据双向通信问题
  11. 串口转usb驱动c语言程序,电脑中USB转串口如何正确安装对应的驱动程序
  12. css3魔方3乘3每层旋转_纯CSS做3D旋转魔方
  13. HDU 6319 Problem A. Ascending Rating (单调队列)
  14. Flink 系例 之 Fold
  15. android qq聊天动态表情的实现
  16. 计算机网络通信的媒体介质,计算机网络基础:常见的网络传输介质
  17. Photoshop | 快速抠头发(调整边缘/选择并遮住)
  18. 2019校园招聘深信服数组翻转题
  19. 研发团队建设的心得体会
  20. off-policy全系列(DDPG-TD3-SAC-SAC-auto)+优先经验回放PER-代码-实验结果分析

热门文章

  1. linux禁止u盘自动运行,求设置U盘自动运行和禁止运行的方法。
  2. 【ZOJ - 3956】Course Selection System(01背包)
  3. 【牛客 - 551C】CSL 的密码(后缀数组,后缀自动机,随机算法)
  4. 【CodeForces - 570A】Elections(模拟,水题)
  5. 视觉SLAM十四讲(1):预备知识
  6. 动手学PaddlePaddle(0):新版本PaddlePaddle安装
  7. linux依赖包在哪个目录,命令-Linux cmd在jar中搜索类文件,而与jar路径无关
  8. matlab 泡泡图,使用matlab绘制2维、3维气泡图
  9. c语言编写一个函数判断闰年,C语言:实现一个函数判断year是不是闰年
  10. java 防止表单重复提交