1

我不确定我是否正确实现了 ReentrantReadWriteLock,所以如果你能告诉我我是否做错了什么,我将不胜感激。

场景:想象一下制作一件衬衫需要两个步骤。衬衫都是一样的。

  1. 第一步,缝纫工具缝制衬衫
  2. 在第二步中,扣扣工具从第一步中取出衬衫并将扣子放在上面。为简单起见,每件衬衫上只会放置一个纽扣。

步骤 1 和步骤 2 分别使用总共 10 个缝纫工具和 10 个纽扣工具。这些按钮被保存在橱柜的不同架子上。

我的目标是确保尽可能多的并发性,同时确保线程不会:

  1. 从同一个架子上拿按钮
  2. 从同一个缝纫工具上取下衬衫
  3. 僵局

因此,我已经对以下代码实施了锁定:

    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();
    }

问题:

  1. 是否有必要实施secondLock?这是因为 firstLock 已经锁定了代码并阻塞了其他线程。

  2. 假设确实需要这两个锁,是否需要创建两个 ReentrantReadWriteLock 对象来提高并发性?我参考了这个链接 - http://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

  3. 我确实阅读了线程和交错,但我不明白以下语句中“交错”的含义。有人可以用外行术语向我解释吗?

Quote: 没有理由阻止 c1 的更新与 c2 的更新交错

来源:http ://docs.oracle.com/javase/tutorial/essential/concurrency/locksync.html

提前致谢!

4

0 回答 0