簡體   English   中英

Java並發編程-同步數組

[英]Java concurrent programming - synchronizing array

假設我有四個班級:聚會,生物,工作,物品。

派對有生物
締約方有項目
生物有工作(線程)
工作需要物品

我在確定如何同步各個項目時遇到麻煩,因此沒有作業可以同時訪問一個項目。 我以表格的形式整理了聚會中所有可用物品的清單

ArrayList<ItemInstance>

其中ItemInstance具有一個Item和一個表示數量的整數。 我不知道如何在此列表上執行鎖定

ReentrantLock resourceLock = new ReentrantLock();
ArrayList<Condition> resourceConditions = new ArrayList<Condition>();

我曾考慮過這樣做,但是鎖定resourceLock會鎖定所有項目,對嗎? 另外,我需要鎖定特定數量的商品。 所以我的數組條目可能是

(Swords, 4)

在我的主列表中,但我可能只需要用3把劍來完成我的工作。 我是否應該將它們全部存儲在單個列中並刪除數量?

總體概念是,我有一個包含所有項目和數量的大聚會清單,然后我有很多工作,而所需的項目和數量卻很少。 我試圖讓我的Jobs線程等待每個項目足夠多,執行,然后釋放要重用的項目。

PartyList = 
(Swords, 7)
(Forks, 2)
(Bottles, 5)

JobEatList = 
(Forks, 1)
//RUN THREAD

PartyList = 
(Swords, 7)
(Forks, 1)
(Bottles, 5)

JobDineList = 
(Bottles, 2)
(Forks, 4)
//WAIT

您應該列出要執行的並發操作(類的方法)的列表。 概述它們的依存關系和不變量,因此您知道可以同時執行哪些操作以及必須對其進行序列化(同步)​​。 將您的工作定義為大多數獨立的任務,以實現最大的並發和最小的阻塞。 好好看一下java.util.concurrent必須提供什么,尤其是Semaphore等更高級別的類。

抱歉,這聽起來太籠統了。

首先,正如其他人所指出的,您需要更加清楚地了解和/或分析您想做的事情。

其次,一種“對程序員來說容易”的方法是對任何“棘手的”使用CopyOnWriteArrayList 就速度而言,它可能不是最高效的,但是對於您的應用程序來說,它可能足夠快。 至少要考慮一下。

暫無
暫無

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

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