在另一个ReentrantReadWriteLock中使用ReentrantReadWriteLock

时间:2014-04-22 21:14:15

标签: java concurrency locking reentrantlock reentrantreadwritelock

我不确定我是否正确实施了ReentrantReadWriteLock,所以如果我做错了可以告诉我,我将不胜感激。

方案: 想象一下,制作衬衫需要两个步骤。衬衫都是相同的。

  1. 第一步,缝纫工具缝制衬衫
  2. 在第二步中,按钮工具从第一步开始取下衬衫并将按钮放在上面。为简单起见,每件衬衫上只放一个按钮。
  3. 步骤1和2分别使用10个缝纫工具和10个扣件工具。按钮保存在橱柜的不同架子上。

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

    1. 从同一个架子上取下按钮
    2. 从同一个缝纫工具上拿衬衫
    3. 死锁
    4. 因此,我已将锁实现为以下代码:

          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. 我读过线程和交错,但我不明白以下语句中“interleaved”的含义。有人可以用非专业术语向我解释一下吗?

      4.   

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

             

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

        提前致谢!

0 个答案:

没有答案