Java 在另一个ReentrantReadWriteLock中使用ReentrantReadWriteLock

Java 在另一个ReentrantReadWriteLock中使用ReentrantReadWriteLock,java,concurrency,locking,reentrantlock,reentrantreadwritelock,Java,Concurrency,Locking,Reentrantlock,Reentrantreadwritelock,我不确定我是否正确实现了ReentrantReadWriteLock,因此如果您能让我知道我是否做错了什么,我将不胜感激 情景: 假设制作衬衫需要两个步骤。这些衬衫都是一样的 在第一步中,缝纫工具缝制衬衫 在第二步中,纽扣工具从第一步中取出衬衫并将纽扣放在上面。为了简单起见,每件衬衫上只会有一个纽扣 第1步和第2步分别使用10个缝纫工具和10个钮扣工具。按钮放在橱柜的不同架子上 我的目标是确保尽可能多的并发性,同时确保线程不会: 从同一个架子上取下按钮 从同一缝纫工具中取出衬衫 死锁 因此,我对

我不确定我是否正确实现了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();
        }
    
    问题:

  • 是否需要执行第二个锁?这是因为firstLock已经锁定了代码并阻止了其他线程

  • 假设两个锁都是必需的,那么是否需要创建两个ReentrantReadWriteLock对象来提高并发性?我从这个链接中引用了-

  • 我确实读过线程和交错,但我不明白下面的语句中“交错”是什么意思。有人能用外行的话给我解释一下吗

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

    资料来源:

    提前谢谢