引用原文文档:
是否公平地授予锁是主观的(即,它由用户的感知或其他相关方式来衡量),并且可能取决于程序的特定需求。这意味着公平性取决于程序的算法,并且只在最小程度上取决于程序使用的同步结构。换句话说,实现完全公平取决于项目的需求。线程库所能完成的最好任务就是以指定且一致的方式授予锁。
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花更多的时间来安排权限(许可)的取得.