我不确定我是否正确实现了 ReentrantReadWriteLock,所以如果你能告诉我我是否做错了什么,我将不胜感激。
场景:想象一下制作一件衬衫需要两个步骤。衬衫都是一样的。
- 第一步,缝纫工具缝制衬衫
- 在第二步中,扣扣工具从第一步中取出衬衫并将扣子放在上面。为简单起见,每件衬衫上只会放置一个纽扣。
步骤 1 和步骤 2 分别使用总共 10 个缝纫工具和 10 个纽扣工具。这些按钮被保存在橱柜的不同架子上。
我的目标是确保尽可能多的并发性,同时确保线程不会:
- 从同一个架子上拿按钮
- 从同一个缝纫工具上取下衬衫
- 僵局
因此,我已经对以下代码实施了锁定:
Lock firstLock = new ReentrantReadWriteLock();
Lock secondLock = new ReentrantReadWriteLock();
if (buttoningTool.ready()) { //check if buttoning-tool is ready
firstLock.writeLock();
if (cupboard.getButton()) { //get button from any available shelf and return true if successful
int shirtNumber = -1;
for (tempSewingTool : allSewingTools) {
if (tempSewingTool.shirtReady()) {
secondLock.writeLock();
shirtNumber = tempSewingTool.takeShirt();
secondLock.unlock();
break;
}
}
if (shirtNumber != 1) {
buttoningTool.activate();
}
}
firstLock.unlock();
}
问题:
是否有必要实施secondLock?这是因为 firstLock 已经锁定了代码并阻塞了其他线程。
假设确实需要这两个锁,是否需要创建两个 ReentrantReadWriteLock 对象来提高并发性?我参考了这个链接 - http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
我确实阅读了线程和交错,但我不明白以下语句中“交错”的含义。有人可以用外行术语向我解释吗?
Quote: 没有理由阻止 c1 的更新与 c2 的更新交错
来源:http ://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html
提前致谢!