考试题目:
资源在N个线程之间共享,以便以先到先得的方式进行访问。解释如何实施先到先得的政策。
我的回答是(注意:课程是基于Java的):
使用信号量(二进制)来控制对共享资源的访问。然后创建一个馈送器类/线程来访问信号量。馈线线程使用FIFO队列来实现先来先服务。当信号量空闲时,它允许线程头部队列访问共享资源。
我刚刚在纸上记下了上述方法,似乎有效。
这个问题在一个20分的问题中值得8分,所以我怀疑使用new ReentrantLock(true)
就足以满分。
你们有什么想法?
答案 0 :(得分:0)
你的答案真的没有解决这个问题。这不仅仅是关于锁定,还涉及排队等待资源的线程。
可能的解决方案类似于以下代码:
lockResource(resource);
try {
... consume the resource
} finally {
unlockResource(resource);
}
lockResource
会执行以下操作:
long accessNum
和long runningNum
的资源相关联的锁定对象。accessNum
值并存储线程的结果。long runningNum
值,看看= {到我的accessNum
。wait()
在资源上。调用unlockResource(...)
时,线程应该:
running++
notifyAll()
如果某个帖子正在等待并被唤醒:
accessNum == runningNum
。wait()