根据锁的添加到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的子类。ReentrantReadWriteLock中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。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Java
# concurrency
# 锁
# Java concurrency之公平锁(一)_动力节点Java学院整理
# Java concurrency之LockSupport_动力节点Java学院整理
# Java concurrency集合之ConcurrentLinkedQueue_动力节点Java学
# Java concurrency集合之ConcurrentSkipListMap_动力节点Java学
# Java concurrency集合之ConcurrentSkipListSet_动力节点Java学
# Java concurrency集合之ConcurrentHashMap_动力节点Java学院整理
# Java concurrency集合之ArrayBlockingQueue_动力节点Java学院整理
# Java concurrency集合之 CopyOnWriteArrayList_动力节点Java学
# Java concurrency之互斥锁_动力节点Java学院整理
# Java concurrency之公平锁(二)_动力节点Java学院整理
# 信号量
# 是一个
# 是指
# 包中
# 则是
# 中有
# 可以通过
# 都是
# 实现了
# 抽象类
# 多个
# 子类
# 适用于
# 死锁
# 包含了
# 它为
# 自己的
# 的是
# 我也
# 是有
相关文章:
如何在IIS中配置站点IP、端口及主机头?
如何配置WinSCP新建站点的密钥验证步骤?
c++ stringstream用法详解_c++字符串与数字转换利器
零服务器AI建站解决方案:快速部署与云端平台低成本实践
正规网站制作公司有哪些,目前国内哪家网页网站制作设计公司比较专业靠谱?口碑好?
如何构建满足综合性能需求的优质建站方案?
如何解决ASP生成WAP建站中文乱码问题?
如何快速生成专业多端适配建站电话?
如何通过cPanel快速搭建网站?
相册网站制作软件,图片上的网址怎么复制?
如何快速查询域名建站关键信息?
网站制作模板下载什么软件,ppt模板免费下载网站?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
制作门户网站的参考文献在哪,小说网站怎么建立?
中山网站制作网页,中山新生登记系统登记流程?
如何在香港服务器上快速搭建免备案网站?
如何确保西部建站助手FTP传输的安全性?
佛山企业网站制作公司有哪些,沟通100网上服务官网?
建站之星Pro快速搭建教程:模板选择与功能配置指南
如何选择适合PHP云建站的开源框架?
javascript中的try catch异常捕获机制用法分析
建站之星导航如何优化提升用户体验?
css网站制作参考文献有哪些,易聊怎么注册?
北京专业网站制作设计师招聘,北京白云观官方网站?
如何用免费手机建站系统零基础打造专业网站?
定制建站平台哪家好?企业官网搭建与快速建站方案推荐
阿里云高弹*务器配置方案|支持分布式架构与多节点部署
建站之家VIP精选网站模板与SEO优化教程整合指南
如何用手机制作网站和网页,手机移动端的网站能制作成中英双语的吗?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?
建站之星logo尺寸如何设置最合适?
如何在IIS中新建站点并解决端口绑定冲突?
如何快速搭建虚拟主机网站?新手必看指南
如何用已有域名快速搭建网站?
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析
制作营销网站公司,淘特是干什么用的?
如何在Windows服务器上快速搭建网站?
攀枝花网站建设,攀枝花营业执照网上怎么年审?
移民网站制作流程,怎么看加拿大移民官网?
如何通过可视化优化提升建站效果?
常州自助建站费用包含哪些项目?
Dapper的Execute方法的返回值是什么意思 Dapper Execute返回值详解
油猴 教程,油猴搜脚本为什么会网页无法显示?
保定网站制作方案定制,保定招聘的渠道有哪些?找工作的人一般都去哪里看招聘信息?
开源网站制作软件,开源网站什么意思?
c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】
西安市网站制作公司,哪个相亲网站比较好?西安比较好的相亲网站?
深圳网站制作费用多少钱,读秀,深圳文献港这样的网站很多只提供网上试读,但有些人只要提供试读的文章就能全篇下载,这个是怎么弄的?
*请认真填写需求信息,我们会在24小时内与您取得联系。