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:默认情况下不能保证获取锁的顺序和线程执行顺序的一致性。
如果想要保证线程执行顺序和获取锁的顺序一致性,也是可以操作的。在下一篇文章中,凯哥将讲解怎么操作。
欢迎来聊
Java并非锁之独占非公平锁理解的更多相关文章
- Java多线程系列--“JUC锁”05之 非公平锁
概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析.内容包括:参考代码获取非公平锁(基于JDK1.7.0_40)释放非公平锁(基 ...
- Java并发编程锁之独占公平锁与非公平锁比较
Java并发编程锁之独占公平锁与非公平锁比较 公平锁和非公平锁理解: 在上一篇文章中,我们知道了非公平锁.其实Java中还存在着公平锁呢.公平二字怎么理解呢?和我们现实理解是一样的.大家去排队本着先来 ...
- Java中的公平锁和非公平锁实现详解
前言 Java语言中有许多原生线程安全的数据结构,比如ArrayBlockingQueue.CopyOnWriteArrayList.LinkedBlockingQueue,它们线程安全的实现方式并非 ...
- Java 公平锁与非公平锁学习研究
最近学习研究了一下Java中关于公平锁与非公平锁的底层实现原理,总结了一下. 首先呢,通过其字面意思,公平与非公平的评判标准就是付出与收获成正比(和社会中的含义差不多一个意思).放到程序中,尤其是 在 ...
- 死磕 java同步系列之ReentrantLock源码解析(一)——公平锁、非公平锁
问题 (1)重入锁是什么? (2)ReentrantLock如何实现重入锁? (3)ReentrantLock为什么默认是非公平模式? (4)ReentrantLock除了可重入还有哪些特性? 简介 ...
- Java锁--非公平锁
转载请注明出处:http://www.cnblogs.com/skywang12345/p/3496651.html 参考代码 下面给出Java1.7.0_40版本中,ReentrantLock和AQ ...
- 浅谈Java中的公平锁和非公平锁,可重入锁,自旋锁
公平锁和非公平锁 这里主要体现在ReentrantLock这个类里面了 公平锁.非公平锁的创建方式: //创建一个非公平锁,默认是非公平锁 Lock lock = new ReentrantLock( ...
- 第五章 ReentrantLock源码解析1--获得非公平锁与公平锁lock()
最常用的方式: int a = 12; //注意:通常情况下,这个会设置成一个类变量,比如说Segement中的段锁与copyOnWriteArrayList中的全局锁 final Reentrant ...
- 多线程编程-- part5.1 互斥锁之非公平锁-获取与释放
非公平锁之获取锁 非公平锁和公平锁在获取锁的方法上,流程是一样的:它们的区别主要表现在“尝试获取锁的机制不同”.简单点说,“公平锁”在每次尝试获取锁时,都是采用公平策略(根据等待队列依次排序等待):而 ...
- 理解ReentrantLock的公平锁和非公平锁
学习AQS的时候,了解到AQS依赖于内部的FIFO同步队列来完成同步状态的管理,当前线程获取同步状态失败时,同步器会将当前线程以及等待状态等信息构造成一个Node对象并将其加入到同步队列,同时会阻塞当 ...
随机推荐
- (sql语句试题练习及 参考答案解题思路+个人解题思路)
SQL字段说明及数据 ======================================================================= 一.部门表字段描述:dp_no 部 ...
- ubuntu pyinstaller 的安装以及使用
使用pyinstaller将Python文件打包成linux可执行文件. 安装pip3: sudo apt-get install python3-pip 更换pip3下载源: 1 sudo su 2 ...
- 常回家看看之off_by_null(堆篇)
上次介绍了堆里面的off_by_one,那么这个off_by_null和它有神马区别呢,哎,别看名字挺像,它俩无论是在栈里面还是堆里面都有很大区别的. off_by_one,这个我们知道可以通过溢出控 ...
- Mysql 分表分库的策略
为什么要分表? 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 日常开发中我们经常会遇到大表的情况 ...
- Java智能之Spring AI:5分钟打造智能聊天模型的利器
前言 尽管Python最近成为了编程语言的首选,但是Java在人工智能领域的地位同样不可撼动,得益于强大的Spring框架.随着人工智能技术的快速发展,我们正处于一个创新不断涌现的时代.从智能语音助手 ...
- 机器学习策略篇:详解如何使用来自不同分布的数据,进行训练和测试(Training and testing on different distributions)
如何使用来自不同分布的数据,进行训练和测试 深度学习算法对训练数据的胃口很大,当收集到足够多带标签的数据构成训练集时,算法效果最好,这导致很多团队用尽一切办法收集数据,然后把它们堆到训练集里,让训练的 ...
- Windows下git配合Unity要设置autocrlf=false
Unity的.asset文件的换行符一定是Unix (LF)格式的,哪怕在设置里选了用Windows (CRLF)也没用,这个选项只对创建的C# Script有效. 这些Unix换行文件提交上去没问题 ...
- IDEA之NexChatGPT插件【工欲善其事必先利其器】
国内有热心的程序员开发了一款NexChatGPT插件,安装后开箱即用十分方便,打字机展示的效果也很流畅,另外插件内还外链了国内能直接访问的ChatGPT,非常推荐试一下,IDEA插件NexChatGP ...
- MobaXterm是一款功能强大的远程SSH利器,是您远程计算机的终极工具箱
MobaXterm 是一款功能强大的远程终端应用,可以用于 Windows 系统上的 SSH.Telnet.RDP.VNC 等远程登录.它支持多种会话类型,拥有强大的终端功能,还支持 X11 图形界面 ...
- [oeasy]python0010_怎么用命令行保存文件
编写 py 文件 回忆上次内容 上次 真的输出了 程序员的浪漫 Hello world! print函数 可以输出 字符串 但是 print这个词 别拼错 就连 大小写 也别能错 错了就改 也没事 ...