IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Java知识库 -> java多线程学习之13同步锁分配的公平性 -> 正文阅读

[Java知识库]java多线程学习之13同步锁分配的公平性

?

引用原文文档:

The last question we need to address is the question of lock fairness. What if we want locks to be issued in a fair fashion? What does it mean to be fair? The ReentrantLock class allows the developer to request that locks be granted fairly. This just means that locks are granted in as close to arrival order as possible. While this is fair for the majority of programs, the definition of "fair" can be much more complex.

我们需要解决的最后一个问题是锁的公平性问题。如果我们想以公平的方式发行锁呢?公平意味着什么?ReentrantLock类允许开发人员请求公平地授予锁。这只是意味着,在尽可能接近到达顺序的情况下授予锁。虽然这对大多数项目来说是公平的,“公平”的定义可能要复杂得多。

?

是否公平地授予锁是主观的(即,它由用户的感知或其他相关方式来衡量),并且可能取决于程序的特定需求。这意味着公平性取决于程序的算法,并且只在最小程度上取决于程序使用的同步结构。换句话说,实现完全公平取决于项目的需求。线程库所能完成的最好任务就是以指定且一致的方式授予锁。?

The ReentrantLock class provides an option in its constructor to specify whether to issue locks in a "fair" fashion. In this case, the definition of "fair" is first-in-first-out. This means that when many lock requests are made at the same time, they are granted very close to the order in which they are made. At a minimum, this prevents lock starvation from occurring.?

ReentrantLock类在其构造函数中提供了一个选项,用于指定是否以“公平”的方式发出锁。在这种情况下,“公平”的定义是先进先出的。这意味着,当同时发出多个锁请求时,它们被授予的权限与发出的顺序非常接近。这至少可以防止锁饥饿的发生。?

ReentrantLock类有个构造方法:
public ReentrantLock(boolean fair);
当这个fair变量取值为true时就是让该Lock类型(注意Lock是个接口类型,ReentrantLock类实现了该接口)对象的锁效应以一种公平的形式在各个竞抢该锁(Lock)的线程(thread)之间分发,"公平"的意义就体现在lock(锁)是以先排队等待的先被服务(授予到)的基本的队列中排队的理念来授予锁的!(将临界资源访问锁(数据同步访问锁)发配给抢到该锁的线程!)
_____________________________________________________________________________
注意:锁分配的公平性会影响线程的"调度优先级"的效果!有可能使得有"高优先级"抢夺系统资源的能力的线程"由于资源锁被公平的分配授权后"而使得要获得该同步锁的"高优调度先级"的线程丧失了其"高优先级"的特性!(通读理解)(因为对临界资源的访问锁会无视“线程的优先级别”以公平的姿态以“先到的线程先被服务”的方式公平的分配到线程身上!)

Semaphore是一个类:

_____________________________________________________________
Semaphore中文直译:信号量
在Java中Semaphore基本上就是一个具有计数器功能的锁(Lock).它(Semaphore)和Lock Interface很像,有一拼,与Lock的差别就是Semaphore有计数器功能而Lock没有!

Semaphore类有一个构造函数可以指定其准予的"许可"的数量!也有一个成员方法能够返回其所拥有的"许可"数量!
_____________________________________________________________________________________________________________________________________
什么是许可:
就是使用权(权限)!就是能够使用的能力!是一种锁!


_____________________________________________________________________________________________________________________________________
许可数目:(许可数)
一个Semaphore类型对象所能够发放的“许可”数量就是该Semaphore对象的许可数量。
就好比一个瑞星杀毒软件的许可数一样(一套正版瑞星杀毒软件在局域网中一次只可以安装到5台计算机,超过这个"许可数目"本例是5即许可数是5)就安装不了了(不能成功安装!);类似的道理一个Semaphore类型实例(对象)的许可数目指的该信号锁(Semaphore类型对象)所能够发放的许可锁数目!
_______________________________________________________________________________________________________________________________
Semaphore工具类是非常类似于Lock接口的功能的,其acquire()(获取许可锁)与release()(释放许可锁)这两个方法分别类似于Lock接口的lock()与unlock()方法!而tryAcquire()方法(用于尝试获取许可)与Lock接口的tryLock()方法(用于尝试获取锁)类似!
__________________________________________________________________________________________________________________________________
注意:对于同一个thread对象而言完全有可能获得来自于同一个Semaphore对象的多个许可!(这种情况下该Semaphore类型对象的许可数目要设置的值应大于1).
即Semaphore类型对象可以被用于部分地模拟Lock类型对象来使用,这种情况下只要将该Semaphore对象的许可数设置为1即可!
__________________________________________________________________________________________________________________________
当Semaphore类型对象的许可数目设置为1时其功能退化成类似于一个普通的Lock(锁)!(注意)
______________________________________________________________________________________
public Semaphore(long permits,boolean fair)构造方法剖析:如果此fair标记为true来构造,信号量会尝试以线程发出对许可获取请求所发出的顺序来分派权限(许可),尽可能接近先到先服务的方式.
这个选项的缺点是速度:virtual machine要比能够直接裁决取得权限(许可)的thread花更多的时间来安排权限(许可)的取得.
?

  Java知识库 最新文章
计算距离春节还有多长时间
系统开发系列 之WebService(spring框架+ma
springBoot+Cache(自定义有效时间配置)
SpringBoot整合mybatis实现增删改查、分页查
spring教程
SpringBoot+Vue实现美食交流网站的设计与实
虚拟机内存结构以及虚拟机中销毁和新建对象
SpringMVC---原理
小李同学: Java如何按多个字段分组
打印票据--java
上一篇文章      下一篇文章      查看所有文章
加:2022-05-12 16:20:27  更:2022-05-12 16:23:06 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 22:17:55-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码