先到先得的共享资源政策

时间:2012-07-23 01:52:54

标签: java multithreading concurrency scheduling

考试题目:

  

资源在N个线程之间共享,以便以先到先得的方式进行访问。解释如何实施先到先得的政策。

我的回答是(注意:课程是基于Java的):

  

使用信号量(二进制)来控制对共享资源的访问。然后创建一个馈送器类/线程来访问信号量。馈线线程使用FIFO队列来实现先来先服务。当信号量空闲时,它允许线程头部队列访问共享资源。

我刚刚在纸上记下了上述方法,似乎有效。

这个问题在一个20分的问题中值得8分,所以我怀疑使用new ReentrantLock(true)就足以满分。

你们有什么想法?

1 个答案:

答案 0 :(得分:0)

你的答案真的没有解决这个问题。这不仅仅是关于锁定,还涉及排队等待资源的线程。

  • 如何对等待资源的线程进行排队?
  • 如果有线程在等待资源,那么如何将它们唤醒以便按顺序使用资源。
  • 如果有线程在等待资源,你如何确保它们按顺序运行并避免新线程抓住它的竞争条件。

可能的解决方案类似于以下代码:

  lockResource(resource);
  try {
     ... consume the resource
  } finally {
     unlockResource(resource);
  }

lockResource会执行以下操作:

  1. 获取资源上的锁。
  2. 检索与包含long accessNumlong runningNum的资源相关联的锁定对象。
  3. 增加accessNum值并存储线程的结果。
  4. 检查long runningNum值,看看= {到我的accessNum
  5. 如果是= =我的,请解锁资源并继续运行。
  6. 如果队列中的人数超过我,则wait()在资源上。
  7. 调用unlockResource(...)时,线程应该:

    1. 锁定资源。
    2. 设置running++
    3. 致电notifyAll()
    4. 解锁资源
    5. 如果某个帖子正在等待并被唤醒:

      1. 检查是否accessNum == runningNum
      2. 如果为true,则解锁资源并继续运行
      3. 如果没有,请返回wait()