您的回答确实没有解决问题。这不仅与锁定有关,而且还与等待资源的线程排队有关。
- 你如何排队等待资源的线程?
- 如果有线程在等待资源,你如何唤醒它们以便它们按顺序消耗资源。
- 如果有线程在等待资源,您如何确保它们按顺序运行并避免围绕新线程抢占它的竞争条件。
可能的解决方案类似于以下代码:
lockResource(resource);
try {
... consume the resource
} finally {
unlockResource(resource);
}
lockResource
会做类似的事情:
- 获取资源上的锁。
long accessNum
检索与包含 a和 a的资源关联的锁对象long runningNum
。
- 增加
accessNum
值并存储线程的结果。
- 检查
long runningNum
值以查看是否 == 到 my accessNum
.
- 如果是 == 我的,解锁资源并继续运行。
- 如果队列中的人数超过我,则
wait()
在资源上。
当unlockResource(...)
被调用时,线程应该:
- 锁定资源。
- 放
running++
- 称呼
notifyAll()
- 解锁资源
如果线程正在等待并被唤醒:
- 检查是否
accessNum == runningNum
.
- 如果为真,则解锁资源并继续运行
- 如果没有,则返回
wait()