簡體   English   中英

可重入鎖不鎖定線程

[英]Reentrant lock not locking threads

我可能無法理解線程的工作方式,這可能是我遇到此問題的原因。 問題是我有一個 REST API 客戶和一個 Web 客戶,他們都在確認已經下達的訂單(訂單屬於將從每個客戶那里收到銷售金額的賣家)。 兩個客戶端都訪問寫入數據庫的相同代碼,我們稱之為 Exclusive_Code_Block。

這個 Exclusive_Code_Block 在 class 中的一個方法中,我試圖在 Exclusive_Code_Block 上加一個鎖,比如:

   try {
        confirmSerially.lock.lock();
        ***** code that accesses database is here ***********
       } finally {
        confirmSerially.lock.unlock();
       }

鎖在組件package中的一個class(ConfirmSerially.java)中:

package com.testing.component;

import java.util.concurrent.locks.ReentrantLock;

import org.springframework.stereotype.Component;

@Component

class ConfirmSerially {

     public ReentrantLock lock = new ReentrantLock(true);

     public ConfirmSerially () {
         
     } 
}

除了糟糕的 java 技能外,我的困惑肯定與線程的工作方式以及它與 class 實例的關系有關!

app客戶端和Web客戶端都在進入Exclusive_Code_Block。 我的期望是,當 REST 應用程序客戶端首先到達鎖定部分時,它將獲得鎖定,go 繼續在 Exclusive_Code_Block 內工作。 如果 Web 客戶端出現,它將不會獲得鎖,因為應用程序客戶端擁有它。 Web 當應用程序客戶端完成 Exclusive_Code_Block 后,客戶端將獲得鎖,退出並釋放鎖。

不太確定如何以及在何處放置鎖,以便每個客戶端/線程在進入 Exclusive_Code_Block 之前都被迫獲取鎖。 這是使用 Spring MVC 和 Hibernate。

我終於通過制作鎖 static 使其工作,使用我在問題中顯示的代碼,鎖不是static ,所以每個線程都有自己的鎖! 使鎖成為final鎖的建議我認為這行不通(我實際上沒有嘗試過,這沒有意義,因為我認為每次鎖被鎖定/解鎖時都必須修改它。

我的猜測是,對於多線程,鎖必須是 static,否則它將無法工作,除非有一些迂回的方式來做到這一點。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM