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花更多的时间来安排权限(许可)的取得.
 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值