- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
ReentrantReadWriteLock 有公平和非公平(默认)模式,但是文档太难理解了。
我怎么理解呢?如果有一些代码示例来演示它,那就太好了。
更新
如果我有一个写线程和很多读线程,哪种模式更好用?如果我使用非公平模式,写线程是否有可能获得锁的机会很小?
最佳答案
非公平是指当锁准备被新线程获取时,该锁不保证谁获取锁的公平性(假设有多个线程请求锁当时)。换句话说,可以想象一个线程可能会一直处于饥饿状态,因为其他线程总是设法任意获取锁而不是它。
公平 模式更像是先到先得,其中保证线程在某种程度上公平,它们将以公平的方式获得锁(例如,在开始等待很长时间的线程之前之后)。
这是一个演示锁公平性的示例程序(因为对公平锁的写锁请求是先到先得)。比较 FAIR = true
(线程总是按顺序服务)和 FAIR = false
(线程有时 服务乱序)。
import java.util.concurrent.locks.ReentrantReadWriteLock;
public class FairLocking {
public static final boolean FAIR = true;
private static final int NUM_THREADS = 3;
private static volatile int expectedIndex = 0;
public static void main(String[] args) throws InterruptedException {
ReentrantReadWriteLock.WriteLock lock = new ReentrantReadWriteLock(FAIR).writeLock();
// we grab the lock to start to make sure the threads don't start until we're ready
lock.lock();
for (int i = 0; i < NUM_THREADS; i++) {
new Thread(new ExampleRunnable(i, lock)).start();
// a cheap way to make sure that runnable 0 requests the first lock
// before runnable 1
Thread.sleep(10);
}
// let the threads go
lock.unlock();
}
private static class ExampleRunnable implements Runnable {
private final int index;
private final ReentrantReadWriteLock.WriteLock writeLock;
public ExampleRunnable(int index, ReentrantReadWriteLock.WriteLock writeLock) {
this.index = index;
this.writeLock = writeLock;
}
public void run() {
while(true) {
writeLock.lock();
try {
// this sleep is a cheap way to make sure the previous thread loops
// around before another thread grabs the lock, does its work,
// loops around and requests the lock again ahead of it.
Thread.sleep(10);
} catch (InterruptedException e) {
//ignored
}
if (index != expectedIndex) {
System.out.printf("Unexpected thread obtained lock! " +
"Expected: %d Actual: %d%n", expectedIndex, index);
System.exit(0);
}
expectedIndex = (expectedIndex+1) % NUM_THREADS;
writeLock.unlock();
}
}
}
}
关于您的更新,使用非公平锁定并不是说线程获得锁定的可能性很小,而是线程必须稍等片刻的可能性很小。
现在,通常随着饥饿期的增加,该时间长度实际发生的概率会降低......就像连续抛硬币 10 次“正面”比连续抛硬币“正面”9 次更不可能发生次。
但是如果多个等待线程的选择算法是非随机的,比如“具有字母顺序名字的线程总是获得锁”那么你可能会遇到真正的问题,因为概率不一定随着线程的增加而降低变得越来越饥饿……如果一枚硬币被加权为“正面”,连续 10 次正面朝上的可能性基本上与连续 9 次正面朝上的可能性相同。
我相信在非公平锁定的实现中使用了一种有点“公平”的硬币。所以问题真的变成了公平性(因此,延迟)与吞吐量。使用非公平锁定通常会带来更好的吞吐量,但代价是锁定请求的延迟偶尔会出现峰值。哪个更适合您取决于您自己的要求。
关于java - ReentrantReadWriteLock的 "non-fair"模式怎么理解?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7962312/
假设我有一大组数据,其中每个数据都有几个可搜索的列(例如颜色、高度、宽度等),这样用户就可以发出诸如“所有红色项目”或“所有具有宽度的绿色项目”之类的搜索50 岁以下。 是否有一种既定的算法可以让我根
我需要得到一个数字的平均值,但不是小数形式,我需要它的“公平”整数形式。我不知道这是否是解释它的最佳方式,所以这里有一些例子。 例子: 51 / 4 = 12.75 但我需要更多的东西: 51 / 4
我正在尝试运行 Fair Scheduler,但它没有将 Map 任务分配给某些节点,只有一个作业正在运行。我的理解是,公平调度程序将使用 conf 插槽限制,除非存在多个作业,此时公平计算开始。我还
当我有一个带分数的排序集时,即使多个项目具有相同的分数,我也希望获得正确的排名。 例如,当有 5 个得分为 1、2、2、2、3 的项目时,我希望这三个中心项目具有相同的排名 (1),而最高分获得排名
具有类 Reentrant(true) 锁的 Lock 接口(interface)的工作方式是它使用 阻塞队列 存储想要获取 的线程锁 .以这种方式“先来,先出去”的线程 - FIFO。一切都清楚。
我需要实现一个公平的排队系统,以便根据某个消息 header 的值,针对当前排队的消息上该 header 的所有值,以循环方式处理消息。 系统中的消息自然地按某些属性进行分组,其中有数千个可能的值,并
我打算做的是限制可以将任务发送到testmonitor队列的用户或组。 在按如下所示设置AclSubmitApps之后,我仍然可以在用户testmonitor中提交配置单元任务,该任务的队列通过set
ReentrantReadWriteLock 有公平和非公平(默认)模式,但是文档太难理解了。 我怎么理解呢?如果有一些代码示例来演示它,那就太好了。 更新 如果我有一个写线程和很多读线程,哪种模式更
在 ConcurrentHashMap 中,我们有基本上扩展了 ReentrantLock 的段。 static final class Segment extends ReentrantLock i
Spark调度器如何选择:FIFO还是FAIR? Spark Scheduler 和 YARN Scheduler 有什么区别? 最佳答案 当您使用 spark-submit 或任何其他方式在集群中提
当调用notify_one()时,是否有关于在atomic_flag上调用wait()的线程被唤醒的顺序的公平性信息。它们是否按照进入 wait() 的确切顺序被唤醒,可以说是 FIFO 吗? 原子标
这是我第一次尝试配置YARN调度程序,但无法正常运行。该群集最初用作FIFO,而我正在尝试使作业并行运行。我已经添加到yarn-site.xml的顶部 yarn.resourcemana
我有一个带有 spark standalone 集群管理器的 2 节点集群。我在 Scala 多线程中使用相同的 sc 触发了多个作业。我发现我的作业是一个接一个地安排的,因为 FIFO 性质所以我尝
我有一份系统用户的列表,这些用户正在等待分配一个帐户。 分配算法非常简单,分配应该尽可能公平,这意味着如果我有 40 个帐户和 20 个系统用户,我需要为每个系统用户分配 2 个帐户。 如果我有 41
在 Ruby 上使用 combination 方法, [1, 2, 3, 4, 5, 6].combination(2).to_a #=> [[1, 2], [1, 3], [1, 4], [1, 5
我有一个关于 YARN“Fair Scheduler”的基本问题。根据the definition “公平调度程序 - 公平调度是一种将资源分配给应用程序的方法,以便所有应用程序平均随着时间的推移获得
在以下情况下,如何确定函数返回 0 或 1 的概率: Let the function_A return 0 with probability 40% and 1 with probability 6
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题? Update the question所以它是on-topic对于堆栈溢出。 8年前关闭。 Improve this que
这个问题已经有答案了: Return bestMove in minimax algorithm for tictactoe (3 个回答) 已关闭 9 年前。 我正在做一个科学博览会项目,用不同的策
我被困在竞争性编程挑战中: https://www.hackerrank.com/challenges/fair-cut/problem 我尝试了什么:使用数组的中位数对数组进行排序,并使用 2 个指
我是一名优秀的程序员,十分优秀!