在下面的方法中,我有一個串列來保存資料,我可以將所有資料填充到這個menuDTOList. 但是,當 a 在從第一個請求中獲取所有資料后發送新請求時,menuDTOList仍然保留第一個請求的資料。
由于有兩種方法相互遞回呼叫,我無法正確清除串列。我試過Collections.synchronizedList()了thread-safety,但沒有任何意義。還嘗試在不同的步驟清除串列,但由于遞回方法呼叫,它無法正常作業。
那么,如何清除每個請求的串列值,同時保持它們在methodA和之間的遞回呼叫methodB?
public class Demo {
// private List<MenuDTO> menuDTOList = new ArrayList<>();
List<MenuDTO> menuDTOList =
Collections.synchronizedList(new ArrayList<MenuDTO>());
protected Iterable<MenuDTO> getData() {
for (...) {
methodA();
}
return menuDTOList;
}
private void methodA(final MenuItemExpandedDTO menuItemExpandedDTO) {
menuDTOList.add(dto);
for (...) {
methodB();
}
}
private void methodB() {
for (...) {
methodA(dto);
}
}
}
uj5u.com熱心網友回復:
如果你這樣做:
public class Demo {
protected Iterable<MenuDTO> getData() {
List<MenuDTO> menuDTOList = new ArrayList<>();
for (...) {
methodA(menuDTOList);
}
return menuDTOList;
}
private void methodA(final MenuItemExpandedDTO menuItemExpandedDTO, final List<MenuDTO> menuDTOList) {
menuDTOList.add(dto);
for (...) {
methodB(menuDTOList);
}
}
private void methodB(List<MenuDTO> menuDTOList) {
for (...) {
methodA(dto, menuDTOList);
}
}
}
然后每個串列實體僅由單個執行緒使用,并且只要呼叫者getData丟棄參考,串列就可以被垃圾收集。
uj5u.com熱心網友回復:
您能否添加更多詳細資訊,for回圈的條件是什么?
在當前狀態下,我在這里看到 2 個不同的問題。
- 方法A和方法B互相呼叫,好像是死回圈問題
- 此外,如果您想讓串列對 setter 來說只是執行緒安全的,您可以創建一個普通的易失性串列。類似的東西
volatile List<MenuDTO> menuDTOList = new ArrayList<>()或者如果您正在尋找開箱即用的資料結構,您可以使用ConcurrentLinkedQueue. 或者最重要的是,提供串列作為方法引數并完全避免類級別變數
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/346493.html
上一篇:為什么在嘗試使用JpaRepository中的save()方法插入新記錄時出現“位于或接近“用戶”的語法錯誤”錯誤?
