Java并非锁之独占非公平锁理解
Java锁系列教程之独占式锁
在Java并发编程中,锁是一个很重要的对象。Java中锁有两种:隐式锁和显式锁。使用synchronized关键字的锁是隐式锁。因为锁的申请和释放都是由JVM来维护的,不用我们来手动处理。使用Java并发包locks包下的锁,需要使用者手动申请和手动关闭。这种形式是显式锁。如果按照多个线程能不能共享同一个锁(资源)来分的话,可以分为独占式(排他)锁和共享锁。其中synchronized关键字的锁和ReentrantLock锁的锁都是独占式锁。
通过前面三篇文章的学习,我们知道了同步组件基础框架-AbstractQueuedSynchronizer(AQS) 同步器。在同步器的方法中有两种方式获取锁:独占式和共享式锁。我们先来学习独占式锁-ReentrantLock。
本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:《Java并发包下锁学习第四篇:ReentrantLock》。
编辑
ReentrantLock使用语法
我们知道并发包下的lock是显式锁,需要手动获取锁和手动释放锁。所以语法如下:
ReentrantLock lock = new ReentrantLock();
try {
lock.lock();
//TODO
}finally {
lock.unlock();
}
获取锁:lock.lock();
释放锁:lock.unlock();
在try中获取到锁;在finally中释放锁。
因为必须释放锁。所以,必须在finally中进行释放锁操作。而且释放锁操作必须放在finally的第一行。
独占式锁理解:
生活中的例子:
在自动ATM机上取钱的时候,我们需要排队,当一个人在操作ATM机取钱的时候,下一个人就需要在ATM机黄线外面等待(排除和取钱人一起去的人)。假设路人甲在操作ATM机的时候,我们其他后面排队的人是不是需要等待着,路人甲从ATM机区域出来后才可以进行操作ATM机。这个操作过程如果放在我们多线程并发角度来思考的话:共享数据是ATM机,多个线程是多个存取钱的人。当路人甲在操作ATM机的时候路人甲获取到ATM机操作权限可以理解为lock.lock()操作。这个时候,共享数据ATM机就会被路人甲独自一个人占用了(独占式获取到了共享数据(或者是锁))。当路人甲操作完离开ATM机这个操作可以理解为lock.unlock()操作。
从上了生活例子中我们可以这么理解独占式锁,所谓的独占式锁就是同一时刻只能有且只有一个线程获取到锁且操作成功,其他线程只能等待释放锁后,在进行操作。
需要说明的是,在Java中隐式锁(synchronized关键字修饰的)也是独占式锁的一种体现。
使用方法一:独占非公平演示
需求:使用三个线程,调用一个方法,在方法内睡眠2s.代码下图:
查看运行结果:
线程2开始获取锁。
线程3开始获取锁。
线程1开始获取锁。
线程2获取到了锁。开始做其他的操作了====do..........
======关闭锁=======
线程3获取到了锁。开始做其他的操作了====do..........
======关闭锁=======
线程1获取到了锁。开始做其他的操作了====do..........
======关闭锁=======
从上图运行结果,我们可以分析出:
1:线程的顺序和我们线程运行的顺序不一致
2:每次只能有一个线程执行完关闭锁之后,其他线程才可以接着使用。
从示例代码,我们可以得到如下总结:
1:reentrantLock是独占式锁;
2:默认情况下不能保证获取锁的顺序和线程执行顺序的一致性。
如果想要保证线程执行顺序和获取锁的顺序一致性,也是可以操作的。在下一篇文章中,凯哥将讲解怎么操作。
欢迎来聊
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
单点登录认证系统 MaxKey v1.3.0 GA
MaxKey介绍 MaxKey(马克思的钥匙),寓意是最大钥匙, 是用户单点登录认证系统(Sigle Sign On System),支持 OAuth 2.0/OpenID Connect、SAML 2.0、JWT、CAS 等标准化的开放协议,基于开放用户安全身份认证系统(User Security Access System),提供简单、可靠和安全的用户认证和单点登录,包含用户认证、单点登录、资源管理、权限管理等。 什么是单点登录(Single Sign On),简称为SSO? 用户只需要登录认证中心一次就可以访问所有相互信任的应用系统,无需再次登录,主要功能: 所有应用系统共享一个身份认证系统 所有应用系统能够识别和提取 ticket 信息 MaxKey on GitHub MaxKey on 码云(Gitee) 官方文档 认证协议 序号 协议 支持 1 OAuth 2.0/OpenID Connect 高 2 SAML 2.0 高 3 JWT 高 4 CAS 高 5 FormBased 中 6 TokenBased(Post/Cookie) 中 7 ExtendApi 低 8 E...
- 下一篇
Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁。其实Java中还存在着公平锁呢。公平二字怎么理解呢?和我们现实理解是一样的。大家去排队本着先来先得到的原则,在排队中,无论身份贵贱,一律平等对待。这是就是我们现实生活中的公平。大家都喜欢公平的。但是在Java中默认是非公平的,为什么呢? 本文主要内容:公平锁的现实生活理解;公平锁演示;为什么Java中默认是非公平锁(公平锁的非公平锁的比较) 本篇是《凯哥(凯哥Java:kagejava)并发编程学习》系列之《Lock系列》教程的第四篇:《Java并发包下锁学习第五篇:公平锁理解及与非公平锁的比较》。 生活中的例子: 同样还是去ATM机取钱的例子。假设现在有3个人使用ATM取钱。路人甲不会用ATM,自己摸索耗时5min,然后终于学会怎么使用了,但是密码又忘掉了。打电话给家里人咨询耗时1min.当路人甲操作完成之后,后面两个人排队接着依次操作,这种方式是谁先到谁先操作,操作完成之后下一个人才可以操作的,不管贫富贵贱,不管你是取100还是取1W,取1W的人在取100的人后面,就要排着队等...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- CentOS8编译安装MySQL8.0.19
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2整合Redis,开启缓存,提高访问速度
- CentOS7编译安装Cmake3.16.3,解决mysql等软件编译问题
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- MySQL8.0.19开启GTID主从同步CentOS8
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7